def _SetupUI(self): main_layout = QVBoxLayout() search_filter_widget = QWidget() search_filter_layout = QHBoxLayout(search_filter_widget) central_widget = QWidget() central_layout = QVBoxLayout(central_widget) panel_splitter = QSplitter(Qt.Horizontal) panel_splitter.setHandleWidth(4) panel_splitter.addWidget(self._source_panel) panel_splitter.addWidget(central_widget) panel_splitter.setStretchFactor(0, 0) panel_splitter.setStretchFactor(1, 1) panel_splitter.moveSplitter(LEFT_PANEL_WIDTH, 1) panel_splitter.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) search_filter_layout.addWidget(self._search_bar) search_filter_layout.addWidget(self._filter_bar) search_filter_layout.setContentsMargins(0, 0, 0, 0) central_layout.addWidget(search_filter_widget) central_layout.addWidget(self._splitter) central_layout.addWidget(self._status_bar) central_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(panel_splitter) self.setLayout(main_layout)
def home(self): """ Add the GUI elements to the window that represent the home state of the application. """ toolbar = self.addToolBar("File") save = QAction(QIcon("res/icon_save.png"), "Save", self) save.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_S)) toolbar.addAction(save) load = QAction(QIcon("res/icon_load.png"), "Load", self) load.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O)) toolbar.addAction(load) toolbar.addSeparator() undo = QAction(QIcon("res/icon_undo.png"), "Undo", self) undo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Z)) toolbar.addAction(undo) redo = QAction(QIcon("res/icon_redo.png"), "Redo", self) redo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Y)) toolbar.addAction(redo) toolbar.addSeparator() zoom_in = QAction(QIcon("res/icon_zoom_in.png"), "Zoom In", self) toolbar.addAction(zoom_in) zoom_out = QAction(QIcon("res/icon_zoom_out.png"), "Zoom Out", self) toolbar.addAction(zoom_out) toolbar.addSeparator() clear = QAction(QIcon("res/icon_clear.png"), "Clear", self) toolbar.addAction(clear) toolbar.addSeparator() grid = QAction(QIcon("res/icon_grid.png"), "Grid", self) toolbar.addAction(grid) toolbar.actionTriggered[QAction].connect(self.toolbar_pressed) splitter = QSplitter(self) splitter.setOrientation(Qt.Vertical) splitter.setHandleWidth(16) self.tile_ed = TileEd(self.size, self.tile_size, self.pixmap, self) scroll_area_tile_ed = QScrollArea() scroll_area_tile_ed.setBackgroundRole(QPalette.Dark) scroll_area_tile_ed.setWidgetResizable(True) scroll_area_tile_ed.setWidget(self.tile_ed) splitter.addWidget(scroll_area_tile_ed) self.tile_sel = TileSelector(self.tile_size, self.pixmap, self) scroll_area_tile_sel = QScrollArea() scroll_area_tile_sel.setBackgroundRole(QPalette.Dark) scroll_area_tile_sel.setWidgetResizable(True) scroll_area_tile_sel.setWidget(self.tile_sel) splitter.addWidget(scroll_area_tile_sel) self.setCentralWidget(splitter)
def _setup(self): self.serial_input = SerialInputGui() self.serial_device = SerialDevicesGui() self.serial_monitor = SerialMonitorGui(self) hsplitter = QSplitter() hsplitter.setRubberBand(-1) hsplitter.setHandleWidth(10) hsplitter.setOrientation(Qt.Horizontal) hsplitter.addWidget(self.serial_monitor) hsplitter.addWidget(self.serial_device) vsplitter = QSplitter() vsplitter.setRubberBand(-1) vsplitter.setHandleWidth(10) vsplitter.setOrientation(Qt.Vertical) vsplitter.addWidget(hsplitter) vsplitter.addWidget(self.serial_input) self.layout.addWidget(vsplitter, 0, 0, 1, 1)
def __init__(self, *args, **kwargs): super(ExchangeSpiderUI, self).__init__(*args, **kwargs) layout = QVBoxLayout() layout.setContentsMargins(QMargins(2, 0, 2, 1)) main_splitter = QSplitter(self) main_splitter.setHandleWidth(1) self.tree_widget = ExchangeLibTree(self) main_splitter.addWidget(self.tree_widget) action_splitter = QSplitter(Qt.Vertical, self) action_splitter.setHandleWidth(1) spider_widget = QWidget(self) spider_widget.setAutoFillBackground(True) palette = QPalette() pix = QPixmap("images/spider_bg.png") pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio) palette.setBrush(QPalette.Background, QBrush(pix)) spider_widget.setPalette(palette) spider_layout = QVBoxLayout() tips_layout = QHBoxLayout() tips_layout.setSpacing(1) tips_layout.addWidget(QLabel("当前交易所:", self)) self.spider_exchange_button = QPushButton("未选择", self) tips_layout.addWidget(self.spider_exchange_button) tips_layout.addWidget(QLabel(self)) tips_layout.addWidget(QLabel("当前操作:", self)) self.spider_action_button = QPushButton("未选择", self) tips_layout.addWidget(self.spider_action_button) tips_layout.addWidget(QLabel(self)) tips_layout.addWidget(QLabel("选择日期:", self)) self.spider_date_edit = QDateEdit(QDate.currentDate(), self) self.spider_date_edit.setCalendarPopup(True) self.spider_date_edit.setDisplayFormat("yyyy-MM-dd") tips_layout.addWidget(self.spider_date_edit) tips_layout.addWidget(QLabel(self)) self.spider_start_button = QPushButton("开始", self) tips_layout.addWidget(self.spider_start_button) tips_layout.addStretch() spider_layout.addLayout(tips_layout) self.spider_status = QLabel("等待开始抓取", self) self.spider_status.setWordWrap(True) self.spider_status.setAlignment(Qt.AlignCenter) spider_layout.addWidget(self.spider_status) spider_widget.setLayout(spider_layout) action_splitter.addWidget(spider_widget) # 解析部分 parser_widget = QWidget(self) parser_widget.setAutoFillBackground(True) palette = QPalette() pix = QPixmap("images/parser_bg.png") pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio) palette.setBrush(QPalette.Background, QBrush(pix)) parser_widget.setPalette(palette) parser_layout = QVBoxLayout() tips_layout = QHBoxLayout() tips_layout.setSpacing(1) tips_layout.addWidget(QLabel("当前交易所:", self)) self.parser_exchange_button = QPushButton("未选择", self) tips_layout.addWidget(self.parser_exchange_button) tips_layout.addWidget(QLabel(self)) tips_layout.addWidget(QLabel("当前操作:", self)) self.parser_action_button = QPushButton("未选择", self) tips_layout.addWidget(self.parser_action_button) tips_layout.addWidget(QLabel(self)) tips_layout.addWidget(QLabel("选择日期:", self)) self.parser_date_edit = QDateEdit(QDate.currentDate(), self) self.parser_date_edit.setCalendarPopup(True) self.parser_date_edit.setDisplayFormat("yyyy-MM-dd") tips_layout.addWidget(self.parser_date_edit) tips_layout.addWidget(QLabel(self)) self.parser_start_button = QPushButton("开始", self) tips_layout.addWidget(self.parser_start_button) tips_layout.addStretch() parser_layout.addLayout(tips_layout) self.parser_status = QLabel("等待开始解析", self) self.parser_status.setAlignment(Qt.AlignCenter) parser_layout.addWidget(self.parser_status) parser_widget.setLayout(parser_layout) action_splitter.addWidget(parser_widget) main_splitter.addWidget(action_splitter) main_splitter.setStretchFactor(0, 4) main_splitter.setStretchFactor(1, 6) layout.addWidget(main_splitter) self.setLayout(layout) main_splitter.setObjectName("mainSplitter") action_splitter.setObjectName("actionSplitter") self.spider_exchange_button.setObjectName("tipButton") self.spider_action_button.setObjectName("tipButton") self.spider_status.setObjectName("spiderStatus") self.parser_exchange_button.setObjectName("tipButton") self.parser_action_button.setObjectName("tipButton") self.parser_status.setObjectName("parserStatus") self.setStyleSheet( "#mainSplitter::handle{background-color:rgba(50,50,50,100)}" "#actionSplitter::handle{background-color:rgba(50,50,50,100)}" "#tipButton{border:none;color:rgb(220,100,100)}" "#spiderStatus,#parserStatus{font-size:16px;font-weight:bold;color:rgb(230,50,50)}" )
class MainView(QWidget): def __init__(self): """ MainView of the application, contains three Widgets divided by splitters from the left: GroupView containg all groups info FeedView containg all feed ArticleBox containg selected article and its content """ super().__init__() self.selected_group = None self.group_view = GroupView(self) self.feed_view = FeedView(self) self.article_box = ArticleBox(self) self.feed_view.selectionModel().selectionChanged.connect( self.set_article) self.group_view.itemClicked.connect( lambda: self.refresh_feed(self.group_view.selectedItems()[0])) self.refresh_groups() all_group = self.group_view.groups["All"] all_group.setExpanded(True) self.refresh_feed(self.group_view.groups["All"]) self.__split = QSplitter(parent=self) self.__split.addWidget(self.group_view) self.__split.addWidget(self.feed_view) self.__split.addWidget(self.article_box) self.__split.setHandleWidth(4) self.__main_layout = QHBoxLayout() self.__main_layout.addWidget(self.__split) self.setLayout(self.__main_layout) def get_user_groups(self, update=False): """ Load all user groups from database to gui Args: update (bool, optional): Enforces selecting group to the first group, Defaults to False. """ group_dict = self.entry["groups"] active_exists = False popular_name = URLHandler.popular_name self.group_view.clear() if popular_name in group_dict: self.get_single_group(group_dict, popular_name) group_dict.pop(popular_name) for group in group_dict: active_exists = self.get_single_group(group_dict, group) ix = self.group_view.model().index(0, 0) if not active_exists or update: self.group_view.selectionModel().setCurrentIndex( ix, QItemSelectionModel.SelectCurrent) self.group_view.expand(ix) def get_single_group(self, group_dict, group): """ Add single group to group view, returns active groups Args: group_dict (dict): dictionary of user groups from database group (string): group name Returns: bool: true if selected group is the group that is being added """ active_exists = False indexes = group_dict[group] urls = [] if self.selected_group == group: active_exists = True for index in indexes: urls.append(self.entry['urls'][index]["actual_url"]) self.group_view.add_group(group, urls, indexes) return active_exists def set_group(self, item, update=False): """ Sets group to provided in item arg If update is set to True group will update even if it is not currenlt selected, used for refreshing Args: item (QItem): selected group update (bool, optional): Enforces group update, Defaults to False. """ if (self.selected_group != item.text(0) or update): self.feed_view.clear_list() self.selected_group = item.text(0) art_list = [] if item.rss_type == "group": for url_name in self.group_view.urls: if item.text(0) in url_name: sub_item = self.group_view.urls[url_name] url = self.entry['urls'][sub_item.url_index] art_list.extend(self.get_gui_articles(url)) elif item.rss_type == "url": url = self.entry['urls'][item.url_index] art_list.extend(self.get_gui_articles(url)) art_list = sorted(art_list, key=lambda x: (not x["seen"], x["date"])) for article in art_list: self.feed_view.append_message(**article) def get_gui_articles(self, url): """ Returns all articles from selected url Args: url (string): url Returns: list: list of article objects """ site = url["rss_title"] art_list = [] for article in url["articles"]: article_bundle = { "date": article["pub_date_parsed"], "title": article["title"], "desc": article["desc"], "seen": article["seen"], "link": article["link"], "site": site, } art_list.append(article_bundle) return art_list def set_article(self, current): """ Sets selected article to seen and updates data of articlebox to view newest content Args: current (QItem): item conteining row with selected article """ row = [qmi.row() for qmi in self.feed_view.selectedIndexes()][0] item = self.feed_view.model().item(row) self.article_box.set_data(**item.article_bundle) self.feed_view.set_seen(item, True) URLHandler.set_article_seen(item.article_bundle['link'], True) def refresh_groups(self, download=False): """ Refreshes groups after adding/removing group or url Args: download (bool, optional): Option to fetch newset article while refreshing content. Defaults to False. """ dbh = DatabaseHandler() self.entry = dbh.get_entry(CredentialsHandler.lastUsername) self.get_user_groups(update=True) if download: self.group_view.menu_refresh_callback( self.group_view.selectedItems()[0]) def refresh_feed(self, item): """Refreshes content of FeedView Args: item (QItem): Item of selected group from groupview """ dbh = DatabaseHandler() self.entry = dbh.get_entry(CredentialsHandler.lastUsername) self.set_group(item, True)
class MainWindow(QMainWindow): """ Main application window :version: :author: pir """ #-------------------------------------------------------------------------- def __init__(self): super().__init__() self.setWindowTitle("Organiser") self.mainLayout = QVBoxLayout() # Create menu bar & menus self.fileMenu = self.menuBar().addMenu("&File") self.openMenuAction = self.fileMenu.addAction("&Open") self.openMenuAction.triggered.connect( self.on_open_action) # New-style connect! self.fileMenu.addSeparator() self.setPreferencesMenuAction = self.fileMenu.addAction( "Set Preferences") self.setPreferencesMenuAction.triggered.connect( self.on_set_preferences_action) self.fileMenu.addSeparator() self.quitMenuAction = self.fileMenu.addAction("&Quit") self.quitMenuAction.triggered.connect(self.on_quit_action) # Create main toolbar self.mainToolBar = QToolBar() self.mainToolBar.setMovable(False) self.addItemToolButton = self.mainToolBar.addAction( QIcon("./mainToolbarIcons/Gnome-item-add.svg"), "Add new item" ) # Icons from https://commons.wikimedia.org/wiki/GNOME_Desktop_icons self.addItemToolButton.triggered.connect(self.on_insert_item_action) self.addChildItemToolButton = self.mainToolBar.addAction( QIcon("./mainToolbarIcons/Gnome-item-add-child.svg"), "Add child item") self.addChildItemToolButton.triggered.connect( self.on_insert_child_item_action) self.mainLayout.addWidget(self.mainToolBar) # Configure window splitter self.splitter = QSplitter() self.splitter.setHandleWidth(2) # Configure item tree widget self.itemTree = ItemTree() self.splitter.addWidget(self.itemTree) self.splitter.addWidget(self.itemTree.editBox) self.mainLayout.addWidget(self.splitter) # Is a status bar needed in this application? #self.statusBar = QStatusBar() #self.mainLayout.addWidget(self.statusBar) # Set layout as the central widget self.mainWidget = QWidget() self.mainWidget.setLayout(self.mainLayout) self.setCentralWidget(self.mainWidget) # TEST ONLY self.uniqueCounter = 0 return #-------------------------------------------------------------------------- def on_insert_item_action(self): """Handler for 'add item' action""" # test code title = str(self.uniqueCounter) self.uniqueCounter += 1 # test code # TODO Get parameters of new task iconIndex = 0 #title = "" deadline = 0 self.itemTree.insert_task_item(iconIndex, title, deadline, True, False) print("adding an item") return #-------------------------------------------------------------------------- def on_insert_child_item_action(self): """Handler for 'add child item' action""" # Test code title = str(self.uniqueCounter) self.uniqueCounter += 1 # TODO Get parameters of new task iconIndex = 0 #title = "" deadline = 0 self.itemTree.insert_task_item(iconIndex, title, deadline, True, True) print("add a child item") return #-------------------------------------------------------------------------- def on_open_action(self): """Handler for 'open' action""" print("open file item") return #-------------------------------------------------------------------------- def on_set_preferences_action(self): """Handler for 'set preferences' action""" self.itemTree.set_item_tree_preferences() return #-------------------------------------------------------------------------- def on_quit_action(self): """Handler for 'quit' action""" print("quitting application") self.close() return
class BasisUI(QSplitter): def __init__(self, *args, **kwargs): super(BasisUI, self).__init__(*args, **kwargs) main_layout = QHBoxLayout() self.variety_tree = VarietyTree(self) main_layout.addWidget(self.variety_tree) self.right_widget = QWidget(self) right_layout = QVBoxLayout() right_layout.setContentsMargins(QMargins(1, 1, 1, 1)) opts_layout = QHBoxLayout() opts_layout.addWidget(QLabel("合约:", self)) self.contract_combobox = QComboBox(self) self.contract_combobox.setMinimumWidth(80) opts_layout.addWidget(self.contract_combobox) self.query_button = QPushButton("查询", self) opts_layout.addWidget(self.query_button) # 日期间隔选项 self.query_month_combobox = QComboBox(self) self.query_month_combobox.addItem("近三月", 3) self.query_month_combobox.addItem("近六月", 6) self.query_month_combobox.addItem("近一年", 12) opts_layout.addWidget(self.query_month_combobox) self.tip_label = QLabel('选择对应品种和合约后查询数据. ', self) opts_layout.addWidget(self.tip_label) opts_layout.addStretch() right_layout.addLayout(opts_layout) self.show_splitter = QSplitter(orientation=Qt.Vertical) # 图形容器 self.chart_view = QWebEngineView(self) self.chart_view.setMinimumHeight(int(self.height() * 0.518)) self.show_splitter.addWidget(self.chart_view) # 数据展示 self.chart_data_table = QTableWidget(self) self.chart_data_table.setEditTriggers( QAbstractItemView.NoEditTriggers) # 不可编辑 self.chart_data_table.setFocusPolicy(Qt.NoFocus) # 去选中时的虚线框 self.chart_data_table.setAlternatingRowColors(True) # 交替行颜色 self.chart_data_table.setFrameShape(QFrame.NoFrame) self.chart_data_table.setColumnCount(6) self.chart_data_table.setHorizontalHeaderLabels( ["品种", "合约", "日期", "现货价", "收盘价", "基差"]) self.show_splitter.addWidget(self.chart_data_table) self.show_splitter.setStretchFactor(0, 6) self.show_splitter.setStretchFactor(1, 4) self.show_splitter.setHandleWidth(2) right_layout.addWidget(self.show_splitter) self.right_widget.setLayout(right_layout) main_layout.addWidget(self.right_widget) self.setLayout(main_layout) self.setStretchFactor(0, 3) self.setStretchFactor(1, 7) self.setHandleWidth(1) self.tip_label.setObjectName("tipLabel") self.chart_data_table.setObjectName("dataTable") self.setStyleSheet( "#tipLabel{border:none;color:rgb(230,50,50);font-weight:bold}" "#dataTable{selection-color:rgb(255,255,255);selection-background-color:rgb(51,143,255);alternate-background-color:rgb(245,250,248)}" )