Я пытаюсь проверить существующие вкладки в QTabBar по списку элементов в QMenu. И если существующие вкладки содержат элементы, которые не найдены в QMenu, эта вкладка должна быть выделена красным.
Изначально я использовал tabTextColor
, но, похоже, он не меняет цвет текста.
Затем, когда я погуглил, некоторые говорили, что вместо этого используют setStylesheet
, и поэтому я решил изменить цвет фона вместо цвета текста, который я изначально искал.
Несмотря на это, у меня возникают проблемы с сохранением красного цвета / установочного цвета для конкретной вкладки.
В моем следующем коде, если я сделаю следующее:
- Заполните 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_())