Установить и сохранить цвет на отдельных вкладках в QTabBar - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь проверить существующие вкладки в QTabBar по списку элементов в QMenu. И если существующие вкладки содержат элементы, которые не найдены в QMenu, эта вкладка должна быть выделена красным.

Изначально я использовал tabTextColor, но, похоже, он не меняет цвет текста. Затем, когда я погуглил, некоторые говорили, что вместо этого используют setStylesheet, и поэтому я решил изменить цвет фона вместо цвета текста, который я изначально искал.

Несмотря на это, у меня возникают проблемы с сохранением красного цвета / установочного цвета для конкретной вкладки. В моем следующем коде, если я сделаю следующее:

  1. Заполните 3 вкладки, например. (A, B, C), содержимое читается из текстового файла
  2. Удалить B из текстового файла
  3. Нажмите на кнопку add, это выделит вкладку B красным
  4. Если я перейду к вкладке C, вкладка C будет окрашена в красный цвет, и начальная подсветка B вернется к исходному цвету. И для любых вкладок, которые я сейчас выберу, они будут выделены красным.

Ценю любые идеи по этому вопросу.

class MyWin(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWin, self).__init__()
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vlay = QtGui.QVBoxLayout(central_widget)
        hlay = QtGui.QHBoxLayout()
        vlay.addLayout(hlay)
        vlay.addStretch()

        self.add_button = QtGui.QToolButton()
        self.tab_bar = QtGui.QTabBar(self)
        self.add_button.setIcon(QtGui.QIcon('add.png'))

        self.qmenu = QtGui.QMenu(self.add_button)
        self.add_button.setMenu(self.qmenu)
        self.add_button.setPopupMode(QtGui.QToolButton.InstantPopup)

        self.qmenu.aboutToShow.connect(self.set_menu)

        self.tab_bar.setTabButton(
            0,
            QtGui.QTabBar.ButtonPosition.RightSide,
            self.add_button
        )
        hlay.addWidget(self.add_button)
        hlay.addWidget(self.tab_bar)

    @QtCore.pyqt.Slot()
    def set_menu(self):
        with open('/Desktop/item_file.txt') as f:
            menu_options = f.read().splitlines()
        self.qmenu.clear()

        self.tabs_precheck()

        for opt in menu_options:
            self.qmenu.addAction(opt, partial(self.set_new_tab, opt))

    def get_all_tabs(self):
        all_existing_tabs = {}
        for index in range(self.tab_bar.count()):
            all_existing_tabs[index] = self.tab_bar.tabText(index)

        return all_existing_tabs

    def set_new_tab(self, opt):
        all_tabs = self.get_all_tabs()

        if not opt in all_tabs.values():
            self.tab_bar.addTab(opt)

    def tabs_precheck(self):
        # Get the tabs that are already populated
        before_tabs = {}
        for index in range(self.tab_bar.count()):
            before_tabs[self.tab_bar.tabText(index)] = index


        # Get the items in qmenu items
        with open('/Desktop/item_file.txt') as f:
           qmenu_items = f.read().splitlines()


        # Get the difference between the 2
        difference = list(set(before_tabs.keys()) - set(qmenu_items))

        for diff in difference:
            # Get the 'before' index
            index_value = before_tabs.get(diff)
            # Set that particular tab background color to 'RED'
            self.tab_bar.setCurentIndex(index_value)
            self.tab_bar.setStyleSheet('''
                QTabBar::tab {background-color: red;}
                '''
            )


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MyWin()
    w.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 08 января 2019

Вы должны использовать setTabTextColor(), но я вижу, что это дает сбой, потому что вы применяете неправильную логику, решение:

def tabs_precheck(self):
    with open('/Desktop/item_file.txt') as f:
       qmenu_items = f.read().splitlines()
       if qmenu_items:
            for index in range(self.tab_bar.count()):
                text = self.tab_bar.tabText(index)
                color = QtCore.Qt.black if text in qmenu_items else QtCore.Qt.red
                self.tab_bar.setTabTextColor(index, color)
...