需要5个基本步骤:
1、创建并初始化子窗口部件
2、把子窗口部件放到布局中
3、设置TAB顺序
4、建立信号-槽之间的连接
5、实现对话框中自定义槽
在QT中要用到qt设计师,首先建立一个项目,然后在项目里面可以新建一个文件夹,比如取名为UI,在里面可以存放界面文件
1、可以在qt设计师下面直接设计,然后保存在UI文件夹下面,右键添加现有文件,就能够把界面导入到工程中
2、直接右键添加新文件,设置好路径,选择QT设计师类而不是只有界面
要在main中包含.h文件,比如:
#include "ui/gotocelldialog.h"
执行:
GotoCellDialog w;
w.show();
QT中选择release版本,debuge速度太慢,此外不要选择shade build,否则再次编译会有问题
如果把ui文件夹删除,那么要重新构建, 此外必须将.pro文件重新修改才行
注:QT中的信号函数是不需要给出函数体实现的,里面的参数是用来传递给槽的,用emit可手动进行发射信号。可以认为信号函数是采用回调函数来实现的,此外信号函数跟槽函数里面的参数顺序还有类型一般是相同的,如果信号函数里面的参数比较多,多余的可以不用!
QT设计师中的体会:
跟Java类似,可以直接拉动控件,先对子窗口进行改动
有四种基本操作模式:1、编辑控件F3 2、编辑信号槽F4 3、编辑伙伴 4、编辑TAB顺序
两个控件声明为伙伴,那么拥有共同的焦点,一般是将Label和edit声明为伙伴,那么当点击ALT+快捷键的时候能够转到相应的控件。
界面为:
1、当将Label与lineedit设置为伙伴后,Cell前面的&就消失
2、设置布局时,先将布局拉近窗体,然后在将子窗口拉进去,而不是选择两个控件然后设置布局,这样子选择的顺序不同可能会有问题
添加分隔符能够对布局里面的窗体进行相应的设置,分隔符只是起辅助作用。
3、设计完界面后,QT会自动生成ui_gotocelldialog.h文件,然后在高版本的QT是不进行显示的,
QT会为设计师所设计的类生成新的文件:
gotocelldialog.h
#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H
#include <QDialog>
namespace Ui {
class GotoCellDialog;
}
class GotoCellDialog : public QDialog
{
Q_OBJECT
public:
explicit GotoCellDialog(QWidget *parent = 0);
~GotoCellDialog();
private slots:
void on_lineEdit_textChanged();
private:
Ui::GotoCellDialog *ui;
};
#endif // GOTOCELLDIALOG_H
可以看出,使用namespace Ui
{
class GotoCellDiag;
}
避免名称冲突,使用class GotoCellDiag进行前置声明
设计一个与界面类相同的名字GoToCellDialog但是是不同的作用域,继承自QDialog
Ui::GotoCellDialog *ui; 将界面类设置为私有,可以对里面的元素进行访问
gotocelldialog.cpp
#include "gotocelldialog.h"
#include "ui_gotocelldialog.h"
//父-子对象机制是在QObject中实现的
GotoCellDialog::GotoCellDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::GotoCellDialog)
{
//初始化窗体
ui->setupUi(this);
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
//让它称为gotocell的子对象 删除父对象时就会自动被删除
ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));
connect(ui->okButton,SIGNAL(clicked()),this,SLOT(accept()));
connect(ui->cancelButton,SIGNAL(clicked()),this,SLOT(reject()));
//信号中多余的参数可以不使用 改为textChanged也是正确的
//on_objectName_signalName 会自动进行信号的链接,而省去写connect的麻烦
// connect(ui->lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(on_lineEdit_textChanged()));
}
GotoCellDialog::~GotoCellDialog()
{
delete ui;
}
//connect(lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(on_lineEdit_textChanged()));
void GotoCellDialog::on_lineEdit_textChanged()
{
ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());
}
在头文件就包含了
"ui_gotocelldialog.h"
因为对其元素进行必要的访问
构造函数的初始化,为基类和成员对象进行初始化
GotoCellDialog::GotoCellDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::GotoCellDialog)
ui->setupUi(this) 初始化窗体部件 以this作为父窗口
qt中的校验器:
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
//让它称为gotocell的子对象 删除父对象时就会自动被删除
ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));
校验器:点击打开链接
正则表达式:点击打开链接
main.cpp:
#include "mainwindow.h"
#include <QApplication>
#include "ui/gotocelldialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GotoCellDialog w;
w.show();
return a.exec();
}