大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

系统架构
您现在的位置: 首页 > 系统架构 > QT > 《大宇:Qt入门到精通》 > [005]继承QDialog完成自己的Dialog

[005]继承QDialog完成自己的Dialog

发布时间:2017/11/15 《大宇:Qt入门到精通》 标签QDialog浏览次数:93

今天紧接着上一次的文章,写一个有点难度的demo,其中包含着一些不常用但特实用的知识点,基础的一带而过,有点不常用,甚至工作一两年的程序员都不经常用到的方法后面会有介绍,但不会从太深的地方去讲解。

首先介绍下软件成型demo:

没错,左上角箭头方向就是今天的“猪脚”,小巧,却五脏俱全。

旁边为.h文件源码,为了方便,源码公开如下,此源码为网上摘抄下来,因为它简单刚好能连接之前文章的知识点。

finddialog.h源码:

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
    Q_OBJECT

public:
    FindDialog(QWidget *parent = 0);

signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs);

private slots:
    void findClicked();
    void enableFindButton(const QString &text);

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};

#endif

然后我将其划分了几个模块:

分别为1 2 3 4 5,3旁边有个小点是我不小心点上去的,我这人懒,没找到橡皮擦,就不动用Photoshop那种庞大的工具去修改这种不足轻重的小点了。

 

然后我们来说下[.h头文件]中的五大模块把:

首先包含各种头文件,这个自然不占用划分模块的一部门,也不进行讲解。

第一模块:

前置声明,以C++编译器的角度来讲,它会告诉C++编译器声明的这些类的存在,而不用提供类定义中的所有细节(一般通常放到头文件中使用),有些人说这样用可以让编译速度变快,我也信了这一点,对于这一点,后面还会有简单的多讲一些。

第二模块:

构造析构模块,当然,文章只有构造一种,也因为构造函数的程序员自己实例化,使得编译器不会再为程序员自动定义构造和析构函数,当然,我拿析构也没什么用

[PS:其实我就是想告诉你们Qt有垃圾回收机制,你们写析构函数去delete内存可写可不写,不会造成内存泄漏的问题,当然写了最好]

第三模块:

信号

第四模块:

槽函数

第五模块:

各种控件的指针。

然后直接上CPP文件吧:

#include <QCheckBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
    : QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));                      //定义一个label控件,注意&符号,这个是绑定快捷方式的标志符号,快捷键为:Alt键+&符号后面的第一个首字母,比如现在的这个label,就是Alt+w
    lineEdit = new QLineEdit;                                   //定义一个QLineEdit控件,其实只要看见new就表示给这个控件分配内存
    label->setBuddy(lineEdit);                                  //给label控件找个小伙伴,设置伙伴函数,label找到小伙伴lineEdit
    caseCheckBox = new QCheckBox(tr("Match &case"));            //定义一个QCheckBox控件
    backwardCheckBox = new QCheckBox(tr("Search &backward"));   //同上,绑定快捷键alt+b,上面那个绑定快捷键alt+c,不要以为我不写就没有了,举一反三下,兄弟姐妹们
    findButton = new QPushButton(tr("&Find"));                  //这就是你们眼中最熟悉的button按钮
    findButton->setDefault(true);                               //默认按钮:当用户按下Enter的时候,能够按下对应的按钮
    findButton->setEnabled(false);                              //false就是不能按了,应该你们经常见过
    closeButton = new QPushButton(tr("Close"));                 //定义一个关闭按钮
    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(enableFindButton(const QString &)));     //绑定信号和槽,大体意思为,lineEdit只要你输入东西,就会执行函数enableFindButton[没错,它是槽函数,我叫它函数有错吗?[○・`Д´・ ○]]
    connect(findButton, SIGNAL(clicked()),
            this, SLOT(findClicked()));                         //绑定信号和槽,按下findbutton按钮,执行findClicked槽函数
    connect(closeButton, SIGNAL(clicked()),
            this, SLOT(close()));                               //绑定关闭按钮,执行标准库中的close()槽函数,不要问我这个函数我怎么没有实现,都能把我程序关了,就是这么神奇!我还不告诉你!
    QHBoxLayout *topLeftLayout = new QHBoxLayout;               //定义一个[左右版本的layout],意思是布局,左右摆积木般的布局
    topLeftLayout->addWidget(label);                            //将label添加进布局里面,第一个添加的为最左边
    topLeftLayout->addWidget(lineEdit);                         //将lineEdit添加进布局里面,第二个添加的放到第一个的右边,依次~~
    QVBoxLayout *leftLayout = new QVBoxLayout;                  //定义一个上下版本的layout,也是布局
    leftLayout->addLayout(topLeftLayout);                       //将原来的布局添加进这个布局里面,就好像之前的用绳子捆好了,这个又开始将上一个放到一个袋子里
    leftLayout->addWidget(caseCheckBox);                        //将caseCheckBox添加进去
    leftLayout->addWidget(backwardCheckBox);                    //同上,添加一个按钮或者叫添加进一个控件,按照顺序,由上至下排
    QVBoxLayout *rightLayout = new QVBoxLayout;                 //是的,又添加了一个
    rightLayout->addWidget(findButton);                         //添加button按钮
    rightLayout->addWidget(closeButton);                        //tongshang
    rightLayout->addStretch();                                  //加个弹簧什么意思?你可以注释掉这个代码看下什么样子的

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("Find"));                                 //设置这个mainwindow窗口的title值
    setFixedHeight(sizeHint().height());                        //设置固定高度
}

void FindDialog::findClicked()
{
    QString text = lineEdit->text();
    Qt::CaseSensitivity cs =
            caseCheckBox->isChecked() ? Qt::CaseSensitive
                                      : Qt::CaseInsensitive;
    if (backwardCheckBox->isChecked()) {
        emit findPrevious(text, cs);                            //发送findPrevious信号,目前没有信号和槽的绑定,所以没什么效果
    } else {
        emit findNext(text, cs);                                //发送findNext信号
    }
}

void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());                    //如果text里面为空,就将此按钮设为不可用
}

Main.cpp源码:

#include <QApplication>

#include "finddialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    FindDialog *dialog = new FindDialog;
    dialog->show();
    return app.exec();
}

伙伴:

弹簧:

有弹簧的时候:

无弹簧的时候:

 

56.2K

您好!请登录

合作网站快捷登录:
点击取消回复

已有1评论

  • 大宇
    大宇 回复

    :lol: :lol:


    2017年11月17日05:07

购物盒子

点击这里给我发消息点击这里给我发消息