简 述: 了解自定义风格控件样式,书写一个简单地例子;然后写了一个小的Qt例子,用来实现和验证它的空间的一些属性和功能的用法。且主要是讲解一些模态和给非模态的知识讲解,本篇比较推荐直接看本例只有知识行的源码,会更加简洁和清晰。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
系统环境:
编程环境: MacOS 10.14.6 (18G103)
编程软件: Qt 5.9.8
, Qt Creator 4.8.2
模态/非模态对话框:
模态对话框:
必须关闭此对话框才可以返回主窗口操作;
使用方式:
.exec()
非模态对话框:
关闭(单机关闭按钮或者关闭对话框)后只是隐藏(缺省的),并不算删除对象(并没有从内存中删除),下载再调用时候,只是打开已经创建的对话框对象。使用方式:
.show()
窗口中的事件:
在对话框和主窗口之间互相操作的关键是要有对方的指针,方才能够传递参数兵并且调用对方函数。
事件(event)是由窗口系统产生的由某些触发的特殊函数,例如鼠标操作,键盘操作的一些事件,还比如说有窗口的显示,关闭,绘画等相关事件。从QWidget继承的窗口部件常用的时间函数有如下几种:
- closeEvent() 窗口关闭时候触发的事件;此时可以加入操作:询问是否关闭窗口
- ShowEvent() 窗口显示的时候触发的事件
- paintEvent () 窗口绘画的事件,
- mouseMoveEvent() 鼠标移动事件
- mousePressEvent() 鼠标按下事件
- mouseReleaseEvent() 鼠标释放事件
- keyPressEvent() 键盘按下事件
- keyReleaseEvent() 键盘释放事件
运行效果:
源码分析:
因为其中使用到了上面的模态和非模态知识,以及窗口之中的一些事件消息,加上这个例子一看代码就明白了,比我单独话费笔墨来写介绍,有点废话的感觉,所以,本篇更加推荐大家直接看源码即可。
其中核心部分的源码,重点和一些难点以及需要注意的一些地方,贴出来如下
class ExCustomMainWin : public QMainWindow
{
Q_OBJECT
public:
explicit ExCustomMainWin(QWidget *parent = nullptr);
~ExCustomMainWin();
void setACellText(int row, int col, QString text); //定位到单元格,并设置字符串
void setActLocateEnable(bool enable); //设置actLocatee的enabled属性
void setDlgLocateNull(); //将ExDlgLocate指针设置为NULL
private slots:
void on_actSetHeader_triggered();
void on_actSetSize_triggered();
void on_actLocate_triggered();
void on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous);
private:
Ui::ExCustomMainWin *ui;
QStandardItemModel *m_model; //数据模型
QItemSelectionModel *m_seleModel; //item选择模型
ExDlgSetHeaders *m_dlgSetHeaders;
ExDlgLocate *m_dlglocate;
QLabel *m_labCellPos; //当前单元格行列号
QLabel *m_labCellText; //当前单元格内容
};
class ExDlgLocate : public QDialog
{
Q_OBJECT
public:
explicit ExDlgLocate(QWidget *parent = nullptr);
~ExDlgLocate();
void setSpinRange(int rowCount, int colCount); //设置spin的设定(最大)值
void setSpinValue(int rowNo, int colNo); //设置spin的初始值
private slots:
void on_btnSetText_clicked();
void on_btnClose_clicked();
private:
Ui::ExDlgLocate *ui;
// QWidget interface
protected:
virtual void closeEvent(QCloseEvent *event) override; //窗口关闭事件,关闭时释放本窗口
virtual void showEvent(QShowEvent *event) override; //窗口显示事件
};
class ExDlgSetHeaders : public QDialog
{
Q_OBJECT
public:
explicit ExDlgSetHeaders(QWidget *parent = nullptr);
~ExDlgSetHeaders();
void setHeaderList(QStringList& headers);
QStringList headerList();
private:
Ui::ExDlgSetHeaders *ui;
QStringListModel *m_model; //管理字符串列表数据
};
class ExDlgSize : public QDialog
{
Q_OBJECT
public:
explicit ExDlgSize(QWidget *parent = nullptr);
~ExDlgSize();
int getRowCount();
int getColCount();
void setRowCol(int row, int col);
private:
Ui::ExDlgSize *ui;
};
源码下载:
https://github.com/xmuli/QtExamples【QtCustomDialogEx】