参考:https://blog.csdn.net/liang19890820/article/details/50974059#comments
因为代理模型样式默认用原始样式覆盖。
首先主函数使用.css文件覆盖所有样式代码:
int main()
{
QApplication application(argc,argv);
QString qss_file = ":/style/style.css";
QFile file(qss_file);
if(file.open(QFile::ReadOnly))
{
QString styleSheet = file.readAll();
application.setStyleSheet(styleSheet);
}
}
解决方法:
new一个使用代理的所需控件,获取该控件样式,覆盖到代理控件上。
以进度条代理为例:
头文件:
class QProgressBarDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
QProgressBarDelegate (QObject *parent = nullptr);
~QProgressBarDelegate();
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
virtual bool editorEvent(QEvent *event,QAbstractItemModel *model,const QStyleOptionViewItem &option, const QModelIndex &index) override;
private:
QScopedPointer<QProgressBar> style_progressBar; //用来获取原有设定的css样式
};
源文件(需要在构造函数new一下,然后写在paint函数里剩下的略):
QProgressBarDelegate::QProgressBarDelegate (QObject *parent)
:QStyledItemDelegate(parent)
,style_progressBar(new QProgressBar())
{
// 可以在这里设置样式
// 如果用css文件设置了样式就不用在这设置了
//style_progressBar->setStyleSheet("QProgressBar{border: none; background-color: transparent;} \
// QPushButton:chunk {background-color:rgb(0,255,180);} ");
}
QProgressBarDelegate::~QProgressBarDelegate(){}
void QProgressBarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionProgressBar cpu_bar;
QWidget * style_widget = style_progressBar.data();
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &cpu_bar,painter,style_widget);
}