文章目录
一、按钮代理代理
- 一、按钮代理代理
- 二、QT代理的自我理解
- 三、QT代理的使用方法
- 四、按钮代理实现方法
- paint函数主要工作
- editorEvent函数主要工作
- 五、简单的按钮代理实现(源码)
- CButtonDelegate代理类
- CButtonDelegate.h
- CButtonDelegate.cpp
- CMainWindow调用类
- CMainWindow.h
- CMainWindow.cpp
- 总结
- 相关文章
下图为按钮代理使用示例图,源码在本文第五节(源码含详细注释) 提示:不会使用Qt设计师设计界面的小伙伴点击这里
QT代理在是QT为了在View中插入控件(至少有其中一作用是这样的),如当QTableView实现翻页功能时能利索的翻页,且使用该控件操作所在行而存在的。
三、QT代理的使用方法- 在使用类中实例化代理对象
- 使用代理对象的父对象的setItemDelegateForRow/setItemDelegateForColumn设置代理的行/列
- 使用connect关联相应的信号和槽
按钮代理不同于其他控件代理,按钮代理只需要实现点击操作即可,因此我在按钮代理中只实现了paint函数和editorEvent函数
paint函数主要工作- 创建QStyleOptionButton的对象,并使用该对象设置的text、state、rect分别设置按钮显示文本、按钮状态、按钮绘画区域。
- 更改按钮状态,当鼠标的pos()值包含在按钮的rect中时需要改变状态(在我写的代码中是有一个标记按钮状态的变量,当事件函数识别到鼠标包含在按钮的rect中时则更新状态)。
- 绘制按钮,可以先创建一个QPushButton对象调用style()->drawControl绘制按钮,其参数为指定控件样式、按钮所绘画的参数(在我这里是QStyleOptionButton对象的指针)、绘画者、指定风格。
- 获取鼠标位置,判断其是否包含在按钮中,方便后面设置状态变量
- 识别鼠标事件当鼠标事件不同时更新不同的状态变量
- 当鼠标单机时发送所需信号到主函数 不过可别忘记设置在调用代理的控件的setMouseTracking属性,否则悬浮效果是不会实现的哦
#include
#include
class CButtonDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit CButtonDelegate(QStyledItemDelegate *parent = nullptr);
//设置按钮样式和文本
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
//相应item的编辑事件
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
signals:
void clicked(int row); //发出点击信号,并传出当前行
};
CButtonDelegate.cpp
#include "CButtonDelegate.h"
#include
#include
CButtonDelegate::CButtonDelegate(QStyledItemDelegate *parent) : QStyledItemDelegate(parent)
{}
void CButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
QStyleOptionButton btnStyle;
btnStyle.text = "我是按钮"; //设置按钮文本
btnStyle.rect = option.rect; //设置按钮区域为当前item的rect
btnStyle.state = QStyle::State_Enabled; //设置按钮状态
QPushButton btn;
btn.style()->drawControl(QStyle::CE_PushButton, &btnStyle, painter,&btn); //将按钮绘制出来
}
bool CButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
Q_UNUSED(model);
QMouseEvent *mouseEvent = static_cast(event);
if(option.rect.contains(mouseEvent->pos()))
{
//此次将会发送两次信号(按下触发和释放触发),若只需要一次信号则添加判断即可
//判断按下:event->type() == QEvent::MouseButtonPress
//判断释放:event->type() == QEvent::MouseButtonRelease
emit clicked(index.row());
}
}
CMainWindow调用类
CMainWindow.h
#include
#include
#include "CButtonDelegate.h"
namespace Ui {
class CMainWindow;
}
class CMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit CMainWindow(QWidget *parent = 0);
~CMainWindow();
private slots:
void on_itemClick(int row); //代理按钮被点击所调用的槽函数
private:
Ui::CMainWindow *ui;
QStandardItemModel *m_model; //tableview中的项目模型
CButtonDelegate *m_delegate; //按钮代理指针
};
#endif // CMAINWINDOW_H
CMainWindow.cpp
#include "CMainWindow.h"
#include "ui_CMainWindow.h"
#include
CMainWindow::CMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::CMainWindow)
{
ui->setupUi(this);
//new出模型对象,并设置到view上
m_model = new QStandardItemModel;
m_model->setHorizontalHeaderLabels(
QStringList() setItem(index, 1, new QStandardItem(QString("第%1行,第1列").arg(index)));
}
}
CMainWindow::~CMainWindow()
{
delete m_delegate;
delete m_model;
delete ui;
}
void CMainWindow::on_itemClick(int row)
{
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?