C++ 模仿基于QApplication::palette()的颜色样式行为

C++ 模仿基于QApplication::palette()的颜色样式行为,c++,qt,qt5,qtablewidget,qpalette,C++,Qt,Qt5,Qtablewidget,Qpalette,这很简单:我想模拟被禁用的项目的颜色变化,而不禁用它 拥有QTableWidgetItem和QStandardItem项,我使用的代码如下 item->setForeground( enabled ? QApplication::palette().color( QPalette::Text ) : QApplication::palette().color( QPalette::Disabled, QPalette::Text ) ); 现在。但是,如果用户使用新调色板调用QAppli

这很简单:我想模拟被禁用的项目的颜色变化,而不禁用它

拥有
QTableWidgetItem
QStandardItem
项,我使用的代码如下

item->setForeground( enabled ? QApplication::palette().color( QPalette::Text ) : QApplication::palette().color( QPalette::Disabled, QPalette::Text ) );

现在。但是,如果用户使用新调色板调用
QApplication::setPalette(…)
,则必须手动刷新该项。我更愿意设置一个
颜色组
角色
,这样Qt就知道如何刷新。可以这样做吗?

要自动执行,必须覆盖QStyledItemDelegate的initStyleOption()方法,并将假启用与新角色关联:

#包括
印证人{
FakeEnableRole=Qt::UserRole+1000
};
类ForegroundDelegate:公共QStyledItemDelegate
{
公众:
使用QStyledItemDelegate::QStyledItemDelegate;
受保护的:
void initStyleOption(QStyleOptionViewItem*选项,常量QModelIndex&index)常量覆盖{
QStyledItemDelegate::initStyleOption(选项,索引);
QVariant val=index.data(FakeRoles::FakeEnableRole);
if(val.canConvert()){
bool enabled=val.value();
选项->调色板.setBrush(Qpalete::Text,
QApplication::palette().color(已启用?QPalette::活动:
Qpalete::Disabled,Qpalete::Text));
}
}
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QTableWidget w(4,4);
ForegroundDelegate*delegate=新的ForegroundDelegate(&w);
w、 setItemDelegate(委派);
对于(int i=0;i有界(0,2)==0;
它->设置数据(FakeRoles::FakeEnableRole,已启用);
}
w、 show();
QTimer::单次激发(1000,[](){
QPalette pal=QApplication::palete();
pal.setColor(qpalete::Active,qpalete::Text,QColor(“鲑鱼”));
pal.setColor(qpalete::Disabled,qpalete::Text,QColor(“青色”));
QApplication::setPalette(pal);
});
返回a.exec();
}

这正是我想要的,非常感谢!因此,虽然这对QTableWidget示例很好,但当与QComboBox一起使用时,它似乎覆盖了除文本之外的所有样式选项。在某些情况下,它甚至似乎与项目的文本相混淆。你知道我在这里做错了什么吗?@DrPepperJo如果没有我不能指出你,我还假设视图使用QStyledItemDelegate作为委托,在QListView的情况下,QTableView和QTreeView使用它。在其他情况下,例如QCOMBOX,可能只是使用具有其他样式的QItemDelegate,因此在放置QStyledItemDelegate时,您正在更改QCOMBOX的默认样式。@DrPepperJo或者您的实现有其他错误。您当前的问题非常集中:QTableWidget,这是正确的做法,因为我们在这里寻找精确的问题,所以最后我建议您使用MCVE问一个新问题