简 述: 了解自定义风格控件样式,书写一个简单地例子;然后写了一个小的Qt例子,用来实现和验证它的空间的一些属性和功能的用法。且主要是讲解一些模态和给非模态的知识讲解,本篇比较推荐直接看本例只有知识行的源码,会更加简洁和清晰。

[TOC]


本文初发于 “偕臧的小站” ifmet.cn,同步转载于此。


系统环境:

编程环境: MacOS 10.14.6 (18G103) 编程软件: Qt 5.9.8Qt 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 &current, 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】