在界面操作中打开窗体关闭窗体,以及在窗体与窗体之间传递数据,这些是我们常常遇到的问题。这了我们首先来熟悉窗体的打开。
一、自己新建一个窗体
比如,我们在建立工程的时候选择了Qt Designer Form那么,系统则会自动为我们生成一个mainwindow.ui,那么我们不可能只有这么一个窗体来回折腾,我们需要新建一个自己的窗体
这个时候我们可以通过项目编辑栏中的form右键,来选择add new来添加一个新form
我们默认添加一个无按钮的对话框
这样就直接生成了对应的UI和cpp,如果你不小心选择了下面的纯UI了
这个时候,我们的对话框窗体是没有办法使用的,这里仅仅完成了UI,没有对应的程序代码文件cpp
这时,我们要为它手动添加代码C++文件,这里我们选择C++ Class,它包含了头文件.h和代码文件.cpp,并选择Widget为基类:
不过,生成的文件可能不能直接给dialog用,我们还必须修改一下,原始的是这样:
#include "about.h"
about::about(QWidget *parent) : QWidget(parent)
{
}
我们修改后为:
#include "about.h"
#include "ui_about.h"
about::about(QWidget *parent) :
QDialog(parent),
ui(new Ui::about)
{
ui->setupUi(this);
}
//增加一个自动销毁的函数
about::~about()
{
delete ui;
}
虽然可以通过改进得到,但还是不建议这么做。太麻烦了。
二、选择并打开自己定义启动窗体
按照我们默认的习惯,我们也许会在这个主窗体(MainWindow.ui)上创建菜单,主要数据展示区等,反正一切主要的设计都在这个窗体中展开了,但事后我们会想,是不是应该在这个主窗体之前先显示一个加载或者登录的窗体呢(比如像微信或者QQ,或者某些收费软件那样)
这个时候我们就要来看看main.cpp,
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
从代码中我们很清晰的发现,其实只要在这里将我们自己的启动窗体的头文件包含进来,并将MainWindow对象替换成我们需要的启动窗体即可,如(添加一个StartFrom.ui),并将上方的代码但凡有MainWindow的地方修改为你要启动的类:
#include"startform.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StartForm w;
w.show();
return a.exec();
}
这个窗体显示完毕再进入主窗体。
二、利用按钮打开新窗体
在按钮下,通过go slot建立对应的事件,调用即可
void StartForm::on_pushButton_clicked()
{
this->hide(); //隐藏登录界面
testDialog *sf=new testDialog();
sf->exec();
}
三、窗体之间的数据传递
窗体之间传递数据,有两种,一种是通过main.cpp在其中设置全局变量。还有一种,在窗体构造函数中增加传递参数,我们必须在头文件声明和cpp中都声明,如:
头文件h
#ifndef TESTDIALOG_H
#define TESTDIALOG_H
#include <QDialog>
namespace Ui {
class testDialog;
}
class testDialog : public QDialog
{
Q_OBJECT
public:
explicit testDialog(QWidget *parent = 0,QString tname,int tflag);
cpp文件
testDialog::testDialog(QWidget *parent,QString tname,int tflag) :
QDialog(parent),
ui(new Ui::testDialog)
{
this->windowTitle()=tname;
ui->setupUi(this);
}
最后,我们在事件中的代码:
void StartForm::on_pushButton_clicked()
{
this->hide();
testDialog *sf=new testDialog(this,QString("传递窗体数值"),9);
sf->exec();
}
在testDialog中,就可以获取到传递过来的值了。