Определите конкретные вкладки QTabWidget с помощью таблицы стилей
В моем проекте у меня есть QTabWidget
с несколькими вкладками, каждая из которых имеет уникальный значок. Я хочу, чтобы значок менялся на более легкую версию обычного значка, когда выбрана вкладка.
Это просто с таблицами стилей QTabBar::tab:selected{image: url(image.png);}
однако проблема заключается в том, что таблица стилей не может различить каждую вкладку, чтобы установить правильный значок. Там не просто значок "вкл" и "выкл". Имеется значок "вкл" и "выкл" для 7 различных значков.
Придерживаться таблицы стилей :selected
Метод, я пытаюсь найти способ сделать это с availableName. Если при создании вкладки я установил для каждого вкладки значение visibleName для идентификатора типа значка (icon_1, icon_2, icon_3 и т. Д.), Я мог бы выбрать его позже в своей таблице стилей с помощью QTabBar::[accessibleName=\"icon_1\"]:selected
,
Однако я не вижу ничего в документации, которая говорит, что я могу установить доступное имя для каждой вкладки. Это возможно? Кроме того, я знаю, что могу прослушивать сигнал currentIndexChanged и обновлять значок без таблиц стилей, однако сам метод определения того, какой значок использовать для каждой вкладки, довольно трудоемкий, поэтому не идеально перепроверять каждую вкладку каждый время индекс изменился. Не говоря уже о том, что пользователь может иметь столько открытых вкладок в любой момент времени. Есть смысл?
Можно ли установить доступное имя на вкладке? Есть ли другой способ выбора между различными вкладками с помощью таблиц стилей? Спасибо за ваше время.
2 ответа
Вы можете достичь этого без написания таблицы стилей.
Как QIcon
объект может содержать несколько изображений, вы можете просто создать QIcon
удерживая оба изображения (нормальное и светлое) для вашей вкладки.
По умолчанию QTabWidget
будет использовать изображение "Состояние = Выкл. и Режим = Нормальный" для невыбранных вкладок и изображение "Состояние = Вкл. и Режим = Нормальный" для выбранной вкладки.
Вот пример кода:
QIcon icon_for_tab1;
icon_for_tab1.addFile("tab1.png", QIcon::Off, QIcon::Normal);
icon_for_tab1.addFile("tab1_lighter.png", QIcon::On, QIcon::Normal);
QIcon icon_for_tab2;
icon_for_tab2.addFile("tab2.png", QIcon::Off, QIcon::Normal);
icon_for_tab2.addFile("tab2_lighter.png", QIcon::On, QIcon::Normal);
QTabWidget *tabWidget;
// Supposing tabWidget point to a valid QtabWidget instance with at least 2 tabs.
tabWidget->setTabIcon(0, icon_for_tab1);
tabWidget->setTabIcon(1, icon_for_tab2);
Вы можете заблокировать другие вкладки, чтобы выделить текущую вкладку. Текст и значки на заблокированных вкладках отображаются серым цветом, поэтому текущая вкладка выделяется.
Я делал это с кодом из SO:
void MainWindow::lockTabs(int except){
for (int i=0; i < ui->tabWidget->count(); i++) {
if (i != except) ui->tabWidget->setTabEnabled(i, false);
}
}
void MainWindow::unlockTabs() {
for (int i=0; i < ui->tabWidget->count(); i++) {
ui->tabWidget->setTabEnabled(i, true);
}
}
ui-> tabWidget - это мой QTabWidget.
В вашем слоте tabBarClicked вы можете выделить текущий:
void MainWindow::on_tabWidget_tabBarClicked(int index) {
this->unlockTabs();
this->lockTabs(index);
}
ИМХО, это то, что пользователь ожидает для выделения текущей вкладки.