在 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; }");
我正在使用 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; }");