当前位置: 首页 > news >正文

【转载】Qt中QStyledItemDelegate的使用(二)

延续上一篇文章。本文给出了一个QStyledItemDelegate类自定义绘制加自定义编辑框的例子。

为方便读者理清思路,我已经尽量简化本文附加的代码了。此程序模拟用户给出星级评价的效果,

在编辑状态下用户可以设置0~5个星星的评价,在普通状态下界面显示对应数量的金黄色星星。

本文代码在VS2017和Qt5.9环境下测试通过。程序运行界面如下:

image

 

头文件。Qt也建议在自绘时同时重写sizeHint()函数给出一个合适的显示空间大小,这里为了简化就不重写了,影响不大:

 1 class MStarDelegate : public QStyledItemDelegate
 2 {
 3     Q_OBJECT
 4 
 5 public:
 6     explicit MStarDelegate(QObject *parent = 0);
 7     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
 8     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
 9     void setEditorData(QWidget *editor, const QModelIndex &index) const override;
10     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
11     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
12 };

CPP文件。在paint(...)函数中首先生成五角星的五个顶点坐标,然后在for循环中从左到右以一定间隔绘制指定数量的星星:

 1 MStarDelegate::MStarDelegate(QObject *parent) :
 2     QStyledItemDelegate(parent)
 3 {
 4 }
 5 
 6 void MStarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
 7 {
 8     QPointF vertex[5]; /* 五角星 Size=20,20 */
 9     for (int i = 0; i < 5; i++)
10     {
11         vertex[i].setX(+10 * sinf(i * 144.0f * (3.1415926535f / 180.0f)));
12         vertex[i].setY(-10 * cosf(i * 144.0f * (3.1415926535f / 180.0f)));
13     }
14 
15     int many = index.data(Qt::DisplayRole).toInt();
16     painter->setPen(Qt::NoPen);
17     painter->setBrush(QColor(255, 170, 0));
18     QSize iconSize = option.decorationSize;
19     QRect thisRect = option.rect;
20     int y = thisRect.y() + thisRect.height() / 2;
21     for (int i = 0; i < many; i++)
22     {
23         painter->save();
24         painter->setRenderHint(QPainter::Antialiasing);
25         qreal left = 2 + iconSize.width() * 0.5 + (2 + iconSize.width()) * i;
26         painter->translate(left, y);
27         painter->scale(iconSize.width() / 20.0, iconSize.height() / 20.0);
28         painter->drawPolygon(vertex, 5, Qt::WindingFill);
29         painter->restore();
30     }
31 }
32 
33 QWidget *MStarDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
34 {
35     QSpinBox* cbBox = new QSpinBox(parent);
36     cbBox->setRange(0, 5);
37     cbBox->setSuffix(u8"");
38     return cbBox;
39 }
40 
41 void MStarDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
42 {
43     QSpinBox* cbWidget = dynamic_cast<QSpinBox*>(editor);
44     cbWidget->setValue(index.data(Qt::DisplayRole).toInt());
45 }
46 
47 void MStarDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
48 {
49     int level = dynamic_cast<QSpinBox*>(editor)->value();
50     model->setData(index, level, Qt::DisplayRole);
51 }
52 
53 void MStarDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
54 {
55     editor->setGeometry(option.rect);
56 }

主窗口的构造函数代码如下。其中QtTest是主窗口类,ui.tvHost是QTableView控件。

 1 QtTest::QtTest(QWidget *parent)
 2     : QMainWindow(parent)
 3 {
 4     ui.setupUi(this);
 5 
 6     ui.tvHost->setItemDelegateForColumn(0, new MStarDelegate(ui.tvHost));
 7     QStandardItemModel* model = new QStandardItemModel(ui.tvHost);
 8     model->setHorizontalHeaderLabels({ u8"状态", u8"说明" });
 9     model->setVerticalHeaderLabels({ u8"设备1", u8"设备2", u8"设备3", u8"设备4" });
10     model->setColumnCount(2);
11     model->setRowCount(4);
12     for (int i = 0; i < 4; i++)
13     {
14         model->setItem(i, 0, new QStandardItem(u8"3"));
15         model->setItem(i, 1, new QStandardItem(u8"示例文字"));
16     }
17     ui.tvHost->setModel(model);
18 }

附:上述代码在测试时候会发现,当鼠标选中星星所在单元格后,星星的背景仍是白色,而不是系统默认的蓝色背景,仿佛没有被选择一样。这个问题需要在paint(...)函数中自己绘制单元格选中时的样式。可在paint(...)函数中添加下述代码绘制蓝色背景:

1 void MStarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
2 {
3     ...
4     if (option.state & QStyle::State_Selected)
5     {
6         painter->fillRect(option.rect, option.palette.highlight());
7     }
8     ...
9 }

代码中option.state代表本单元格的状态。常见的有State_Enabled表示没有被禁用;State_Selected表示被选中;State_HasFocus表示拥有键盘输入焦点,系统默认是在单元格边缘绘制虚线矩形。还有很多其它的我也不太明白是什么意思。

转载自:https://www.cnblogs.com/mengxiangdu/p/17831787.html

class MStarDelegate : public QStyledItemDelegate{    Q_OBJECT
public:    explicit MStarDelegate(QObject *parent = 0);    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;    void setEditorData(QWidget *editor, const QModelIndex &index) const override;    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;};
http://www.rkmt.cn/news/83471.html

相关文章:

  • 2025年国内离心机靠谱厂家推荐,国内离心机十大品牌,行业十大厂家,国内离心机生产商推荐 - 品牌推荐大师1
  • nginx rewrite用法
  • 2025年国产高速/冷冻/低速离心机供应商源头实力优质知名本地生产厂家推荐 - 品牌推荐大师1
  • 2025年冷冻离心机品牌TOP6:优质设备选购指南 - 品牌推荐大师1
  • 2025-2026年中国车辆仓储管理服务平台综合评估报告 - 资讯焦点
  • 切换Rust版本
  • 2025年12月内容审核公司哪家靠谱?优质机构深度解读,智能治理时代的合规之选 - AIEO
  • 当代体系化国学传播奠基人叶无为(字号零) 为国学新时代传承与发展开辟新道路 - 资讯焦点
  • 【Prompt 3】:用更通俗易懂的方式解释
  • 2025年低速/高速离心机冷冻/医用/实验室离心机市场关于生产厂家,市场口碑等核心分析 - 品牌推荐大师1
  • 2025 水分仪市场解析:水分仪推荐生产厂家/源头厂家/推荐供应商卡尔费休水分仪哪个牌子好/哪家好哪家性价比高/哪个公司口碑好 - 品牌推荐大师1
  • 【转载】Qt 使用委托QItemDelegate 于 QTableView单元格添加控件
  • 2025航空障碍灯品牌有哪些?航空障碍灯厂家推荐解析 - 栗子测评
  • 2025割草机连接器厂家推荐!深圳防水连接器厂家,适配性拉满 - 栗子测评
  • 2025年国产平行/光催化/聚合/升降式反应釜供货商靠谱厂家有哪些,哪家售后好哪家技术强 - 品牌推荐大师1
  • 2025年12月企业境外投资备案/odi登记/境外投资备案/odi备案代理服务商综合推荐与选择指南 - 2025年11月品牌推荐榜
  • 2025年12月徐州模型生产/起重机模型/挖掘机模型制作厂家综合推荐 - 2025年11月品牌推荐榜
  • 2025苏州庆典活动公司推荐优选 - 栗子测评
  • 2025年12月锅炉防磨罩,锅炉防磨护瓦,锅炉耐磨陶瓷弯头厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • CDN热点扩散原理
  • 2025年评价高的郑州气体报警器厂家最新TOP排行榜 (1) - 朴素的承诺
  • LLM驱动的多智能体心灵感应协作
  • 2025年12月珠宝热熔胶点胶机,烫钻点胶机,水钻热熔胶点胶机厂家测评:精准控胶品牌优选​ - 品牌鉴赏师
  • 2025年12月上海新中式装修,上海简约装修,上海中古风装修公司推荐:闭口合同+实景案例解析!​ - 品牌鉴赏师
  • 采用Deployment Center 安装TeamCenter 2506 于Windows Server 2022 桌面体验版(2/4)
  • 麦角硫因品牌权威评测:TOP10科学抗衰方案深度解析 - 资讯焦点
  • 2025UVC 紫外杀毒灯驱动芯片哪家强?10 家优质服务商 - 栗子测评
  • 2025年12月通风管,耐高温通风管,pvc通风管厂家推荐:行业权威盘点与品质红榜发布​ - 品牌鉴赏师
  • 2025恒流灯带驱动芯片哪家好?优质厂家盘点测评 - 栗子测评
  • 2025年12月徐州模型生产/工程机械模型/起重机模型公司推荐top5 - 2025年11月品牌推荐榜