当前位置: 首页 > 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.jsqmd.com/news/72956/

相关文章:

  • GitHub 热榜方案 - 日榜(2025-10-26)
  • 2025年台式高速离心机/土壤/微型/微孔板/高速冷冻离心机国内知名厂家/有哪些厂家/哪家性价比 - 品牌推荐大师1
  • 2025年国内离心机靠谱厂家推荐,国内离心机十大品牌,行业十大厂家,国内离心机生产商推荐 - 品牌推荐大师1
  • 2025年如何选择排名前列的泵送剂外加剂品牌厂家? - 讯息观点
  • Meta闭源模型vocado、Google Gemini TTS情绪语音、微软智能体新高度
  • 什么?全面解析机器人流程自动化的定义与核心概念就是RPA
  • nginx rewrite用法
  • 2025年国产高速/冷冻/低速离心机供应商源头实力优质知名本地生产厂家推荐 - 品牌推荐大师1
  • 全网热议!2025专业HIFI耳机口碑推荐,甄选5款优质耳机 - 讯息观点
  • 2025年冷冻离心机品牌TOP6:优质设备选购指南 - 品牌推荐大师1
  • 2025-2026年中国车辆仓储管理服务平台综合评估报告 - 资讯焦点
  • 切换Rust版本
  • 2025最新红粉佳人鲜花基地TOP5评测!国内云南等地鲜花优质鲜花厂家选择指南,科技培育+品种创新权威榜单发布,赋能花卉产业升级新生态 - 全局中转站
  • 【转载】Qt中QStyledItemDelegate的使用(一)
  • 2025年聚合物修补料销售厂家推荐,精选修补料砂浆供应商 - 讯息观点
  • 学习路线
  • 当代体系化国学传播奠基人叶无为(字号零) 为国学新时代传承与发展开辟新道路 - 资讯焦点
  • 【Prompt 3】:用更通俗易懂的方式解释
  • QStyledItemDelegate
  • 2025年12月高压固态软启动柜厂家推荐:最新权威测评,技术力、规模化实测榜单 - AIEO
  • GPT-0: Attention+Transformer+可视化 - 详解
  • 2025年低速/高速离心机冷冻/医用/实验室离心机市场关于生产厂家,市场口碑等核心分析 - 品牌推荐大师1
  • 向量概念和运算规则笔记
  • 【Prompt 2】:提高产出效率
  • 2025 国内低代码平台 TOP10 科普:AI 融合成主流,企业选型不踩坑 - 品牌推荐排行榜
  • 免费好用还不限速?2025年12月远程控制软件实测:谁才是办公首选!
  • 2025 水分仪市场解析:水分仪推荐生产厂家/源头厂家/推荐供应商卡尔费休水分仪哪个牌子好/哪家好哪家性价比高/哪个公司口碑好 - 品牌推荐大师1
  • 2025 水分仪市场解析:水分仪推荐生产厂家/源头厂家/推荐供应商卡尔费休水分仪哪个牌子好/哪家好哪家性价比高/哪个公司口碑好 - 品牌推荐大师1
  • 2025年离心机国内知名厂家,离心机品牌排行推荐,离心机头部企业优质供应商,离心机有哪些厂 - 品牌推荐大师1
  • 2025年离心机国内知名厂家,离心机品牌排行推荐,离心机头部企业优质供应商,离心机有哪些厂 - 品牌推荐大师1