在 QTabBar 中的各个选项卡上设置和保留颜色

Set and retain color on individual tabs in QTabBar

我正在尝试根据 QMenu 中的项目列表检查 QTabBar 中的现有选项卡。如果现有选项卡包含在 QMenu 中找不到的项目,则该选项卡将以红色突出显示。

最初我使用的是 tabTextColor 但是它似乎并没有改变文本颜色。 然后当我四处搜索时,有人说要改用 setStylesheet 因此我决定更改背景颜色而不是我最初想要的文本颜色。

即便如此,我在 'retaining' 特定选项卡的红色/设置颜色方面遇到了问题。 在我的以下代码中,如果我执行以下操作:

  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_())

你必须使用 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)