欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT第一篇——创建对话框

程序员文章站 2022-07-13 23:34:52
...

前言

本文参考资料:

  • Jasmin Blanchette<C++ GUI QT4编程(第二版)> 电子工业出版社

本文主要实现功能为:编写一个Find对话框。其运行效果如下图所示:
QT第一篇——创建对话框

在QT中,一个整体的部件可以封装为一个类。而一个类分别对应一个cpp文件和一个h文件。所以本章内容共包含3个文件:

  • finddialog.h
  • finddialog.cpp
  • main.cpp

通过运行效果图,可以看出这个对话框中包含以下几种类型:

  • class QCheckBox;
  • class QLabel;
  • class QLineEdit;
  • class QPushButton;

如下图:
QT第一篇——创建对话框
另外,还可以考虑到:

  1. 只有当搜寻框中填写有效字母,才能使得Find按键有效。
  2. 只有按下Find按钮,对话框才会发送查询信号。而根据Search back选项,可以查询信号应该有两种,向前查询与向后查询。
  3. 只有按下close按钮,对话框才会退出。

综上,这个对话框可以出发三种动作,所以对应三个connet()函数。而FindDialog类自身应该包含两个槽函数。分别对应查询框文本变化和Find按键被按下。close按键按下应该调用继承的close函数,无需再定义。

头文件

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include<QDialog>//QT对话框的基类

//对话框中用到的QT类 声明
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);//此处const和&同时使用的目的,是为了加快程序执行速度。不用复制自定义对象的同时,也不会改变自定义对象内容
    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 // FINDDIALOG_H



C文件

#include<QtGui>
#include"finddialog.h"
//构造函数
FindDialog::FindDialog(QWidget *parent):QDialog(parent)
{
    /**************1.创建子控件*****************/
    //第一部分:查找内容
    label=new QLabel(tr("Find &what:"));//创建一个标签
    lineEdit=new QLineEdit;//创建一个文本框
    label->setBuddy(lineEdit);//将文本框作为标签的友好控件

    //第二部分:查找选项
    caseCheckBox=new QCheckBox(tr("Match &case"));//大小写敏感选项
    backwardCheckBox=new QCheckBox(tr("Search &back"));//查找方向选项

    //第三部分:触发按钮
    findButton=new QPushButton(tr("&Find"));//创建查找按钮
    findButton->setDefault(true);//将查找按钮设置为默认按钮
    findButton->setEnabled(false);//查找按钮默认不使能
    closeButton=new QPushButton(tr("close"));//创建关闭按钮

    /*****************2.连接信号槽**********************/
    connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));//只要查找内容改变,调用查找按键使能函数
    connect(findButton,SIGNAL(clicked()),this,SLOT(findCliked()));//当find按键按下,触发findClicked函数
    connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));//当close按键按下,关闭当前对话框


    /*****************3.布局子控件**********************/
    //需要注意的是,布局共用了两种布局类:
    //QHBoxLayout:水平排列
    //QVBoxLayout:垂直排列
    QHBoxLayout *topLayout=new QHBoxLayout;//创建上布局,包括标签和文本框
    topLayout->addWidget(label);
    topLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout=new QVBoxLayout;//创建左布局,包括上布局和两个复选框
    leftLayout->addLayout(topLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout=new QVBoxLayout;//创建右布局,包括两个按键
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();//填充空白,增加分隔符

    QHBoxLayout *mainLayout=new QHBoxLayout;//创建主分布,包括左分布和右分布
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);

    setLayout(mainLayout);
    /*****************4.设置对话框自身属性********************/
    setWindowTitle("Find");
    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);
    }else
    {
        emit findNext(text,cs);
    }
}

//按键使能
void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}


主函数文件

#include "finddialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    FindDialog *findDialog=new FindDialog;

    findDialog->show();


    return a.exec();
}
相关标签: QT qt qt4