在 QTabBar 中的各个选项卡上设置和保留颜色
Set and retain color on individual tabs in QTabBar
我正在尝试根据 QMenu 中的项目列表检查 QTabBar 中的现有选项卡。如果现有选项卡包含在 QMenu 中找不到的项目,则该选项卡将以红色突出显示。
最初我使用的是 tabTextColor
但是它似乎并没有改变文本颜色。
然后当我四处搜索时,有人说要改用 setStylesheet
因此我决定更改背景颜色而不是我最初想要的文本颜色。
即便如此,我在 'retaining' 特定选项卡的红色/设置颜色方面遇到了问题。
在我的以下代码中,如果我执行以下操作:
- 填充 3 个选项卡,例如。 (A, B, C), 从文本文件中读取的内容
- 从文本文件中删除 B
- 单击
add
按钮,这会将 B 选项卡突出显示为红色
- 如果我导航到选项卡 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)
我正在尝试根据 QMenu 中的项目列表检查 QTabBar 中的现有选项卡。如果现有选项卡包含在 QMenu 中找不到的项目,则该选项卡将以红色突出显示。
最初我使用的是 tabTextColor
但是它似乎并没有改变文本颜色。
然后当我四处搜索时,有人说要改用 setStylesheet
因此我决定更改背景颜色而不是我最初想要的文本颜色。
即便如此,我在 'retaining' 特定选项卡的红色/设置颜色方面遇到了问题。 在我的以下代码中,如果我执行以下操作:
- 填充 3 个选项卡,例如。 (A, B, C), 从文本文件中读取的内容
- 从文本文件中删除 B
- 单击
add
按钮,这会将 B 选项卡突出显示为红色 - 如果我导航到选项卡 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)