c++ - 在 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,则它不会显示正确的样式。我该如何解决这个问题,还是我完全错了?
解决方案
您必须调用 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);
}
推荐阅读
- c# - C#从派生类访问父类的属性
- java - 使用 JUnit 在 Intellij 上运行特定测试
- .net - 无法在 VS2008 中添加服务参考
- tensorflow - 如何在 Tensorflow 中训练单个类的高特异性?
- angular - 无法将渐变添加到 Angular6 中的 C3 面积样条图
- bigdata - 如何为众多开发者提供大数据仓库的独家副本?
- sql - SSIS:从源(SQL Server)到目标(SQL Server)的大量数据传输
- regex - 使用正则表达式查找所有不以给定单词开头的单词
- apache - sites/default/files/* 下的 Drupal html 文件正在下载但正在执行
- node.js - Elasticsearch 6.2 - 长文本的完成建议