通过样式表识别特定的 QTabWidget 标签

Identify Specific QTabWidget Tabs via Stylesheet

在我的项目中,我有一个带有多个选项卡的 QTabWidget,每个选项卡都有一个独特的图标。我希望图标在标签为select ed时更改为普通图标的较轻版本。

使用样式表很简单 QTabBar::tab:selected{image: url(image.png);} 但是问题是样式表无法区分每个不同的选项卡以设置正确的图标。不只是 'on' 和 'off' 图标。有 7 个不同图标的 'on' 和 'off' 图标。

坚持使用样式表 :selected 方法,我试图找到一种使用 accessibleName 来完成此操作的方法。如果在创建选项卡时我将每个选项卡的 accessibleName 设置为图标类型标识符(icon_1、icon_2、icon_3 等),我可以稍后在我的样式表中 select QTabBar::[accessibleName=\"icon_1\"]:selected.

但是我在文档中没有看到任何内容表明我可以为每个选项卡设置 accessibleName。这可能吗?另外,我知道我可以监听 currentIndexChanged 信号并在没有样式表的情况下更新图标,但是确定每个选项卡使用哪个图标的实际方法是相当多的工作,因此重新检查每个选项卡并不理想索引发生变化的时间。更不用说用户可以在任何给定时间打开尽可能多的选项卡。有道理吗?

是否可以将 accessibleName 设置到选项卡上?还有另一种通过样式表在不同选项卡之间 select 的方法吗?谢谢你的时间。

您可以锁定其他选项卡以突出显示当前选项卡。锁定选项卡中的文本和图标显示为灰色,因此当前选项卡突出显示。

我曾经用 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);
}

恕我直言,这是用户希望突出显示当前选项卡的内容。

您无需编写样式表即可实现此目的。

由于一个 QIcon 对象可以包含多个图像,您可以简单地创建一个 QIcon 包含两个图像(普通图像和浅色图像)的选项卡。

默认情况下,QTabWidget 将为未选择的标签使用 "State = Off and Mode = Normal" 的图像,为选定的标签使用 "State = On and Mode = Normal" 的图像。

这是一个示例代码:

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);