在 QListWidget 中突出显示小部件

Highligting widgets in QListWidget

我正在使用 QListWidget 作为(稍作修改的)IRC 客户端的频道选择器。我想指出几件事,例如未读消息,使用 QSS 来设置条目的样式。到目前为止,我有这样的代码:

class MainWindow : public QWidget {
    QListWidgtet *channels;
    
    MainWindow() {
        channels = new QListWidget(this);
        addChannel("test");
        addChannel("test2");
        QObject::connect(channels, &QListWidget::currentItemChanged, this, &MainWindow::changeChannel);
        setStyleSheet("QLabel[selected=\"true\"] { color: #ff0000; }");
    }
    
    void addChannel(QString name) {
        QListWidgetItem* item = new QListWidgetItem(name, channels);
        QLabel* l = new QLabel(name);
        l->setProperty("selected", false);
        channels->addItem(item);
        channels->setItemWidget(item, l);
    }

    void changeChannel(QListWidgetItem *current, QListWidgetItem *previous) {
        //do stuff
        channels->itemWidget(current)->setProperty("selected", true);
        if (previous != nullptr) 
            channels->itemWidget(previous)->setProperty("selected", false);
    }
};

我知道我可以在 QSS 中使用 QListWidget::item:selected,但是我想要其他属性,例如未读,也具有独特的 QSS 样式。此代码的问题在于它不会动态更新。如果我将默认值(在 addChannel 函数中设置的值)设置为 true,那么它会显示正确的样式,但是如果我将默认值设置为 false 然后在单击时将其设置为 true,它不会显示正确的样式。我该如何解决这个问题,还是我的做法完全错误?

必须调用QStyle的polish()函数才能更新画作。

if(QWidget *current_widget = channels->itemWidget(current)){
    current_widget->setProperty("selected", true);
    current_widget->style()->polish(current_widget);
}
if (QWidget *previous_widget = channels->itemWidget(previous)){
    previous_widget->setProperty("selected", false);
    previous_widget->style()->polish(previous_widget);
}

试试这个方法。

l->setStyleSheet("QLabel[selected=\"true\"] { color: #ff0000; }");