Определение конкретных вкладок QTabWidget с помощью таблицы стилей

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

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

Придерживаясь метода таблицы стилей :selected, я пытаюсь найти способ сделать это с помощью accessName. Если при создании вкладки я задаю для каждой вкладки доступное имя идентификатора типа значка (icon_1, icon_2, icon_3 и т. д.), я могу выбрать его позже в своей таблице стилей с помощью QTabBar::[accessibleName=\"icon_1\"]:selected.

Однако я не вижу в документации ничего, что говорит о том, что я могу установить доступное имя для каждой вкладки. Это возможно? Кроме того, я знаю, что мог бы прослушивать сигнал currentIndexChanged и обновлять значок без таблиц стилей, однако фактический метод определения того, какой значок использовать для каждой вкладки, довольно трудоемок, поэтому не рекомендуется перепроверять каждую вкладку каждую время, когда индекс изменился. Не говоря уже о том, что у пользователя может быть открыто столько вкладок в любой момент времени. Есть смысл?

Можно ли установить доступное имя на вкладке? Есть ли другой способ выбора между различными вкладками с помощью таблиц стилей? Спасибо за ваше время.


person mrg95    schedule 21.11.2016    source источник


Ответы (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);
person Benjamin T    schedule 21.12.2016
comment
Я понятия не имел, что ты можешь это сделать! Спасибо! Однако я не мог использовать addFile таким образом, перечисленные вами аргументы неверны. Я выбрал addPixmap, что в основном то же самое, но не нужно указывать QSize. - person mrg95; 22.12.2016

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

Раньше я делал это с кодом из 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);
}

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

person WKarl    schedule 21.11.2016
comment
Спасибо за ответ. На самом деле это не касалось вопроса, потому что я хочу найти способ выбрать конкретную вкладку с помощью таблиц стилей. Мой вариант использования был именно таким, и хотя ваше предложение может сработать для некоторых, оно не сработает для меня, потому что мои значки уже имеют оттенки серого. В частности, белый, и отключение вкладки не затемняет значок. Он просто остается ярко-белым. - person mrg95; 21.11.2016