Essential Qt 第三章 搜寻对话框

    对于大多数window7/10等win用户来说,windows自带的记事本程序再熟悉不过了,他提供了最基本的文本编辑功能,接下来几章我们将制作一个类似的程序,整个程序相对(之前几章的例子)比较大,所以我们先从他的一个对话框开始。
    

    这是一个查询对话框,和windows记事本的对话框很相似,这个对话框中除了前面章节已经介绍过的QLabel和QPushButton外,还使用了
    QLineEdit  这是一个基于行的文本编辑器,提供了基础的文本编辑功能
    QCheckBox 这个是单选框,功能和他的名字一样。
    另外一个就是QDialog,对话框在图像编程中最常见的窗体,很多程序都会利用对话框和用户进行信息交互,在QT中,大多数对话框都会继承自QDialog.
     要完成这个对话框的制作,我们首先分两步,第一步,制作界面布局,第二步,实现他的功能
     这个对话框被暂时命名为FindDialog,首先是他的头文件代码
    
#include<QDialog>  //注释1
#include<QLineEdit>
#include<QCheckBox>
#include<QPushButton>
#include<QLabel>
class FindDialog:public QDialog
{
  private:
    QLabel* Title_Label;
    QLineEdit* FindString_LineEdit;
    QPushButton* Find_PushButton;
    QPushButton* Close_PushButton;
    QCheckBox* MatchCase_CheckBox;
    QCheckBox* GoBack_CheckBox;
  public:
    FindDialog(QWidget* parents = 0);  //注释2
};


  注释1  这里包含了各控件所需要的头文件,其中QDialog是作为QFindDialog的基类
  注释2 这是构造函数,参数是一个QWidget的指针,前面说过Qt中窗体部件都会继承自QWidget,这个参数默作用是设置这个窗体的父窗体,如果值使用默认值,就说明该窗体没有父窗体。
 然后是FindDialog.cxx文件
#include<QHBoxLayout>
#include<QVBoxLayout>
#include"FindDialog.h"
FindDialog::FindDialog(QWidget* parents):QDialog(parents) //注释1
{
  Title_Label = new QLabel(tr("查询内容"));  //注释2
  FindString_LineEdit = new QLineEdit;
  Find_PushButton = new QPushButton(tr("查询"));
  Close_PushButton = new QPushButton(tr("取消"));
  MatchCase_CheckBox = new QCheckBox(tr("区分大小写"));
  GoBack_CheckBox = new QCheckBox(tr("向后查询"));

  QHBoxLayout* String_Layout = new QHBoxLayout;  //注释3
  String_Layout->addWidget(Title_Label);
  String_Layout->addWidget(FindString_LineEdit);
  QVBoxLayout* Case_Layout = new QVBoxLayout;
  Case_Layout->addLayout(String_Layout);
  Case_Layout->addWidget(MatchCase_CheckBox);
  Case_Layout->addWidget(GoBack_CheckBox);
  QVBoxLayout* PushButton_Layout = new QVBoxLayout;
  PushButton_Layout->addWidget(Find_PushButton);
  PushButton_Layout->addWidget(Close_PushButton);
  PushButton_Layout->addStretch();
  QHBoxLayout* Main_Layout = new QHBoxLayout;
  Main_Layout->addLayout(Case_Layout);
  Main_Layout->addLayout(PushButton_Layout);
  setLayout(Main_Layout);
  Main_Layout->setSizeConstraint(QLayout::SetFixedSize);  //注释4


  Find_PushButton->setDefault(true); //注释5
  Find_PushButton->setEnabled(false);
  
  setWindowTitle(tr("查询"));
}


    注释1 在构造函数中调用基类的构造函数,参数parent的类型是QWidget*,传递的参数只要是继承自QWidget的窗体都可以作为参数,即这个窗体的父窗体。参考C++中公有继承的is-a关系
    注释2 创建我们需要的各个窗体部件
    注释3 使用布局管理器来安装各个窗体部件,代码比较多但其实就是布局管理器的各种嵌套,具体步骤:
            a.把QLabel和QLineEdit放入一个QHBoxLayout(既String_Layout)
            b.把上面的String_Layout和两个QCheckBox放入一个QVBoxLayout(即Case_Layout)
            c.把2个QPushButton放入一个QVBoxLayout(即PushButton_Layout),然后在下面价格弹簧addStretch()
            d.把Case_Layout和PushButton_Layout放入一个QHBoxLayout(即Main_Layout)
              当然就像前面布局一章中演示的那样,你也可以尝试用其他的嵌套来完成这个界面布局
    注释4 这个函数的作用是限定对话框的大小,对于Qt各窗体部件,如果你没有设置他大小的情况下,都会有一
               个Qt认为最合适的大小,事实上这个大小大多数情况下都符合我们的要求,所以用这个函数使得对话框
                的大小固定为默认值,即Qt认为最适合的值,这个函数通常用于窗体需要禁止拉伸的情况下
     注释5 这里调用了几个窗体的成员函数
                 setDefault()函数,用于设置这个按钮为默认按钮,默认按钮的意义在于,当你的当前窗体为对话框
                                                  的时候,按下回车建,程序将认为你点击了该按钮
                 setEnabled()函数,设置查询按钮不可用,当QLineEdit里的内容为空的时候,该按钮不可用
      最后我们要调用这个FindDialog类,来生成一个具体的对象,我们可以编写一个简单的Main.cxx来实现
#include<QApplication>
#include"FindDialog.h"
int main(int argc , char** argv)
{
  QApplication app(argc,argv);
  FindDialog A;
  A.show();
  app.exec();
}


注意这里使用了FindDialog A而不是FindDialog* A = new FindDialog,这当然是为了内存的考虑。
     
      现在我们完成了第一步,界面的制作,然后我们需要实现他的具体功能
      我们先要添加2个功能,第一,点击取消按钮的时候,这个对话框能够关闭,第二,当QLineEdit里有内容的时候,查询按钮可用,需要实现这2个功能,需要用到信号与槽
     首先看下FindDialog.h文件的改动
#include<QDialog>
#include<QLineEdit>
#include<QCheckBox>
#include<QPushButton>
#include<QLabel>
class FindDialog:public QDialog
{
  Q_OBJECT   //注释1
  private:
    QLabel* Title_Label;
    QLineEdit* FindString_LineEdit;
    QPushButton* Find_PushButton;
    QPushButton* Close_PushButton;
    QCheckBox* MatchCase_CheckBox;
    QCheckBox* GoBack_CheckBox;
  public:
    FindDialog(QWidget* parents = 0);
  public slots:
    void Find_PushButtonIsEnable(const QString& str);  //注释2
};


 注释1 这里添加了一行Q_OBJECT,这是一个Qt定义的宏,如果一个类需要使用信号与槽,就必须添加这个宏
 注释2  这里添加了一个共有槽,用于设置查询按钮是否可用,这里注意的是槽有私有和公有的区别,共有槽在
              类外也可以链接(使用),而私有槽只能用于类的内部,这个和私有/公有成员函数是一致的   
然后在看下FindDialog.cxx文件的改动
#include<QHBoxLayout>
#include<QVBoxLayout>
#include"FindDialog.h"
FindDialog::FindDialog(QWidget* parents):QDialog(parents)
{
  Title_Label = new QLabel(tr("查询内容"));
  FindString_LineEdit = new QLineEdit;
  Find_PushButton = new QPushButton(tr("查询"));
  Close_PushButton = new QPushButton(tr("取消"));
  MatchCase_CheckBox = new QCheckBox(tr("区分大小写"));
  GoBack_CheckBox = new QCheckBox(tr("向后查询"));

  QHBoxLayout* String_Layout = new QHBoxLayout;
  String_Layout->addWidget(Title_Label);
  String_Layout->addWidget(FindString_LineEdit);
  QVBoxLayout* Case_Layout = new QVBoxLayout;
  Case_Layout->addLayout(String_Layout);
  Case_Layout->addWidget(MatchCase_CheckBox);
  Case_Layout->addWidget(GoBack_CheckBox);
  QVBoxLayout* PushButton_Layout = new QVBoxLayout;
  PushButton_Layout->addWidget(Find_PushButton);
  PushButton_Layout->addWidget(Close_PushButton);
  PushButton_Layout->addStretch();
  QHBoxLayout* Main_Layout = new QHBoxLayout;
  Main_Layout->addLayout(Case_Layout);
  Main_Layout->addLayout(PushButton_Layout);
  setLayout(Main_Layout);
  Main_Layout->setSizeConstraint(QLayout::SetFixedSize);

  Find_PushButton->setDefault(true);
  Find_PushButton->setEnabled(false);
  
  connect(FindString_LineEdit,SIGNAL(textChanged(const QString&)),this,SLOT(Find_PushButtonIsEnable(const QString&)));
  connect(Close_PushButton,SIGNAL(clicked()),this,SLOT(close()));   //注释1

  setWindowTitle(tr("查询"));
}
void FindDialog::Find_PushButtonIsEnable(const QString& str)   //注释2
{
  Find_PushButton->setEnabled(!str.isEmpty());
}


       注释1  这里进行了2个链接,点击关闭按钮,触发clicked()信号,链接到这个类(对话框)的close()槽,这
                  个FindDialog类继承自QDialog,close()是QDialog的一个共有槽,用于关闭自身
                   对于QLineEdit,有一个信号textChanged(const QString&),每当编辑行的内容发生改变的时候就会
                   发射这个信号,我们在FindDialog中自定义了一个公有槽,和这个信号链接
      注释2  这是自定义的共有槽,当然,这个函数也完全可以当初普通的公有成员函数来使用,信号会把编辑
                   行的内容以QString的形式传递过来,通过判断QString是否为空就可以设置查询按钮是否可用

    我们运行这个程序后可以实现2个功能,第一,往编辑行里面写一些东西,查询按钮就会变为可用,删除掉编辑行里的内查询按钮又会便的不可用,第二,点击取消按钮的时候这个窗体会关闭,即程序结束
 

留下的问题
      a.这个对话框还有很多功能没有做上去,当然,这个需要和记事本程序一起完成,所以其他的功能留到
          后面和记事本完成
       b.可能你已经发现这个程序不再想以前那样,“一点点内存泄漏关系不大”,内存是否泄漏很重要,前面的
           章节之所以演示一些错误的做法是希望你不要犯类似的问题,具体的情况很快就会讲述
       c.如果你熟悉windows的记事本程序,你会发现,他的对话框和这个有些不同,差不多应该是这个样子
                 
          这里查询方向使用了QGroupBox和QRadioBox的组合,关于这两个窗体部件使用可以参加assistant,然
          后写一个这样的程序
        d.使用assistans,这很重要,非常的重要,Qt的内容太多,不可能记住所有,任何教材也只能介绍很少一
          部分内容,当遇到问题时,如QGroupBox和QRadioBox的使用,assistant上可以找到答案
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值