首页 > 解决方案 > 在 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);
    }
};

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

标签: c++qtqt5

解决方案


您必须调用 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);
}

推荐阅读