2016-11-21 12 views
0

В моем проекте у меня есть QTabWidget с несколькими вкладками, каждый из которых имеет уникальный значок. Я хочу, чтобы значок переключался на более легкую версию обычного значка всякий раз, когда была выбрана вкладка.Определите конкретные вкладки QTabWidget через таблицу стилей

Это просто с таблицами стилей QTabBar::tab:selected{image: url(image.png);}, однако проблема заключается в том, что таблица стилей не может различать каждую вкладку, чтобы установить правильный значок. Существует не только значок «on» и «off». Для 7 разных значков есть значок «on» и «off».

Придерживаясь стилем :selected, я пытаюсь найти способ выполнить это с помощью доступногоName. Если при создании табуляции я установил для доступногоName для каждой вкладки идентификатор типа значка (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); 
+0

Я понятия не имел, что вы можете это сделать! Благодаря! Однако я не мог использовать addFile, так что приведенные вами аргументы неверны. Я выбрал addPixmap, который в основном то же самое, но QSize не требуется. – mrg95

0

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

Я использовал, чтобы сделать это с кодом от 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); 
} 

ИМХО это то, что ожидает пользователь для выделения текущей вкладки.

+0

Спасибо за ответ. На самом деле это не касалось вопроса, потому что я хочу найти способ выбрать конкретную вкладку через таблицы стилей. Мой вариант использования был именно таким, и, хотя ваше предложение может работать для некоторых, оно не будет работать для меня, потому что мои значки уже оттенки серого. Белый, в частности, и отключение вкладки не затемняет значок. Он просто остается ярко-белым. – mrg95