class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.view = QWebEngineView(self) self.view.load(QUrl("https://cges30901.github.io/test/multicolumn/img")) self.setCentralWidget(self.view) self.view.loadFinished.connect(self.paginate) self.view.focusProxy().installEventFilter(self) self.pageIndex = 0 def eventFilter(self, source, e): if source == self.view.focusProxy(): #pos_js = self.view.page().scrollPosition().x() - self.view.page().contentsSize().width() + self.view.width() if e.type() == QEvent.Wheel: self.pageCount=round(self.view.page().contentsSize().height()/self.view.height()) pageHeight=self.view.page().contentsSize().height()/self.pageCount if e.angleDelta().y() > 0: if self.pageIndex > 0: self.pageIndex -= 1 elif e.angleDelta().y() < 0: if self.pageIndex < self.pageCount - 1: self.pageIndex += 1 self.view.page().runJavaScript("window.scrollTo({0}, {1});" .format(self.view.page().scrollPosition().x() , pageHeight * self.pageIndex)) print(self.pageIndex,self.view.height(), self.view.page().scrollPosition().y(), self.view.page().contentsSize().height()) return True else: return False return False @pyqtSlot(bool) def paginate(self): self.view.page().runJavaScript(''' var el = document.querySelectorAll('img'); for(var i = 0; i < el.length; i++){ //wrap image in div so two consecutive images can be separated var wrapper = document.createElement('div'); el[i].parentNode.insertBefore(wrapper, el[i]); wrapper.appendChild(el[i]); //prevent pagination failure when wide images exist el[i].style.maxHeight = "100%"; el[i].style.maxWidth = document.documentElement.clientWidth + "px"; el[i].style.margin = 0; } var columnInit = Math.floor(document.body.scrollWidth / document.documentElement.clientWidth); for(var column = columnInit; column < columnInit * 2; column++){ document.body.style.columnCount = column; document.body.style.height = column + "00vh"; if(document.body.scrollWidth <= document.documentElement.clientWidth){ break; } } //hide scroll bar document.body.style.overflow='hidden'; ''')
class QAWindow(QMainWindow): def __init__(self): super().__init__() self.timer = QTimer(self) self.timer.setInterval(500) self.timer.timeout.connect(self.roll) self.kline_chart = KlineChart() self.macd_chart = MACDChart() self.get_stock_list() self.init_layout() self.setGeometry(0, 0, 1024, 768) self.setWindowTitle(r"K线图") self.setStyleSheet("background:black") self.loadStyleSheet() self.center() self.show() #self.showMaximized() def loadStyleSheet(self): """ 加载QSS全局样式文件 :return: """ file = QFile('qss/mainwindow.qss') #file = QFile('qss/my.qss') file.open(QFile.ReadOnly) style = file.readAll() sheet = str(style, encoding='utf8') qApp.setStyleSheet(sheet) file.close() def resizeEvent(self, event): """ 窗口大小改变时需要动态调整图形 :param event: :return: """ indexList = self._stock_list_bar.selectionModel().selectedIndexes() if len(indexList) <=0 : pass for index in indexList: print(index.row()) self.table_item_selected(index) return def get_stock_list(self): """ 获取股票代码 :return: """ df = QA.df_get_stock_list() self.stock_list = df.values def center(self): """ 主窗口居中显示函数 :return: """ screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2) def init_layout(self): """ 界面布局 :return: """ #定义GridLayout布局,主界面分成3行3列,第一行放按钮,第一列放表格,第二列放两张图形,最后一列放滚动文字 self._grid = QGridLayout() self._grid.setSpacing(5) self._gridwiget = QWidget(self) self._gridwiget.setLayout(self._grid) self.setCentralWidget(self._gridwiget) self._grid.setRowStretch(0, 1) self._grid.setRowStretch(1, 20) self._grid.setRowStretch(2, 8) self._grid.setColumnStretch(0, 1) self._grid.setColumnStretch(1, 8) self._grid.setColumnStretch(2, 1) self._grid.setColumnMinimumWidth(0, 230) self._grid.setColumnMinimumWidth(2, 200) #表格第一行设置为菜单按钮行 labTest = QLabel("占位符") labTest.setStyleSheet("background:rgb(50,50,50)") self._grid.addWidget(labTest, 0, 0, 1, 3) #添加tabwidget,第一列为table,放在tab里,有多个table self._left_tabwidget = QTabWidget(self) self._left_tabwidget.setTabPosition(QTabWidget.West) self._left_tabwidget.setTabShape(QTabWidget.Rounded) self._grid.addWidget(self._left_tabwidget, 1, 0, 2, 1) #股票代码列表,放进tab里 self._stock_list_bar = QTableView() self._stock_list_bar.setObjectName("stocklisttable") column_names = ["序号","代码","名称"] self.fill_table(self._stock_list_bar, "股票代码", column_names, self.stock_list) #添加kline_chart self._k_line_chart = QWebEngineView() self._k_line_chart.page().setBackgroundColor(Qt.black) self._grid.addWidget(self._k_line_chart, 1, 1) #添加bar_chart self._macd_bar_chart = QWebEngineView() self._macd_bar_chart.page().setBackgroundColor(Qt.black) self._grid.addWidget(self._macd_bar_chart, 2, 1) #添加滚动文字在最后一列中 self._news_message_grid = QGridLayout() self._news_message_grid_wiget = QWidget(self) self._news_message_grid_wiget.setLayout(self._news_message_grid) self._news_message_grid_wiget.setStyleSheet("background: rgb(50,50,50)") self._grid.addWidget(self._news_message_grid_wiget, 1, 2, 2, 1) self._news_title = QLabel("最新资讯") self._news_title.setObjectName("news_title") self._news_title.setAlignment(Qt.AlignCenter) self._news_message_grid.addWidget(self._news_title, 0,0) self._news_message_text = QTextEdit() self._news_message_text.setReadOnly(True) self._news_message_grid.addWidget(self._news_message_text, 1,0) self.set_news(self._news_message_text, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB" "BBCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCC" "CCCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCAAA" "AAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAA" "AAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBB" "BBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBB" "BCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCC" "CCCCCCCCAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCAABB" "BBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCC" "AAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBC") def fill_table(self, table_view, table_view_name, column_names, data_list): """ 填充左侧表格内容 :param table_view:表格对象 :param table_view_name: :param column_names:列名数组 :param data_list:数据列表 :return: """ if table_view is None: return if column_names is None or len(column_names) <= 0: return self._left_tabwidget.addTab(table_view, table_view_name) currentBar = self._left_tabwidget.tabBar() currentBar.setShape(QTabBar.RoundedEast) model = QStandardItemModel() model.setColumnCount(len(column_names)) for i in range(len(column_names)): model.setHeaderData(i, Qt.Horizontal, column_names[i]) table_view.setModel(model) table_view.setColumnWidth(0, 40) table_view.setColumnWidth(1, 60) table_view.setColumnWidth(2, 80) hv = QHeaderView(Qt.Vertical) hv.hide() table_view.setVerticalHeader(hv) table_view.horizontalHeader().setStretchLastSection(True)#最后一列填充整个表头 table_view.setEditTriggers(QAbstractItemView.NoEditTriggers) table_view.setSelectionBehavior(QAbstractItemView.SelectRows) table_view.clicked.connect(self.table_item_selected) if data_list is None or len(column_names) <= 0: return for j in range(len(data_list)): model.setItem(j, 0, QStandardItem("{0}".format(j))) model.setItem(j, 1, QStandardItem(data_list[j][0])) model.setItem(j, 2, QStandardItem(data_list[j][1])) model.item(j, 0).setForeground(QBrush(Qt.white)) model.item(j, 1).setForeground(QBrush(Qt.darkYellow)) model.item(j, 2).setForeground(QBrush(Qt.yellow)) def table_item_selected(self, index): row = index.row() print(self.stock_list[row][0], self.stock_list[row][1]) v1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38], [2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8], [2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82], [2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38], [2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73], [2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03], [2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07], [2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82], [2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78], [2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63], [2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65], [2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14], [2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02], [2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96], [2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33], [2255.77, 2270.28, 2253.31, 2276.22]] self.kline_chart.set_chart_size(self._k_line_chart.width()-20, self._k_line_chart.height()-20) self.kline_chart.set_html_chart_name(self.generate_random_chart_name()) self.kline_chart.set_chart_data(["2017/7/{}".format(i + 1) for i in range(31)], *v1) self.kline_chart.create_chart("chart") self.kline_chart.connect_slot(self.load_kline_chart) v2 = [2309.16, 2286.6, 2264.83, 2333.29, 2282.17, 2263.97, 2253.25, 2286.33] self.macd_chart.set_chart_size(self._macd_bar_chart.width() - 20, self._macd_bar_chart.height() - 20) self.macd_chart.set_bar_chart_name(self.generate_random_chart_name()) self.macd_chart.set_chart_data(["2017/7/{}".format(i + 1) for i in range(8)], v2) self.macd_chart.create_chart("bar") self.macd_chart.connect_slot(self.load_macd_chart) def load_kline_chart(self, path): self._k_line_chart.load(QUrl.fromLocalFile(path)) self._k_line_chart.show() def load_macd_chart(self, path): self._macd_bar_chart.load(QUrl.fromLocalFile(path)) self._macd_bar_chart.show() print(path) def generate_random_chart_name(self): return "kline_chart_{0}.html".format(random.randint(1, 10000)) def set_news(self, textEdit, message): textEdit.setText(message) def start_timer(self): self.timer.start() def stop_timer(self): self.timer.stop() def roll(self): print("timer")