在QT中使用信号和槽机制来完成对象之间的协同操作。简单地说,信号和槽都是函数,比如单机窗口上的一个按钮想要弹出一个对话框那必须将整个按钮的单击信号和定义的槽关联起来。
第一步双击.ui文件,在设计模式中添加一个label(我是主界面) 和push button(显示子窗口),
第二步打开MyWIdget类声明写上槽声明:
public slots:
void showChildDialog();
这里自定义了一个槽,槽必须声明为slots,这里使用了public slots,表明整个槽可以在类外被调用。
第三步到源文件中编写整个槽的实现代码,这里Qt creator设计了一个快速添加声明的方法;单击showChildButton()。然后按下Alt +Enter,编辑器就会转到mywidget.cpp中,并且已经创建了showChildDialog()槽的定义,只需才添加代码即可。
void MyWidget::showChildDialog()
{
QDialog * dialog =new QDialog(this);
dialog ->show();
}
这种方法也适用于现在源文件中添加定义,然后自动在头文件中添加声明的情况。
第四步更改MyWidget类的构造函数如下:
MyWidget::MyWidget(QWidget * parent):
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
connect(ui ->showChildButton,SIGNAL(clicked()),
this,SLOT(showChildDialog()));
}
这里使用了connecet()函数将按钮的单击信号clicked()与新建的槽进行关联。clicked()信号在QPushButton类中进行了定义,而connect()是QObject类中的函数,因为类继承自QObject,所以可以直接使用。
这个函数中的的4个参数分别是:发送信号的对象,发送的信号,接收信号的对象和要执行的槽,而信号和槽要分别使用SIGNAL()和SLOT()宏括起来。
2.自定义对话框
第一步添加自定义对话框类。首先向该项目中添加Qt设计界面类。界面模板选择Dialog without Buttons,类名改为MyDialog。然后再设计模式窗口添加两个Push Button,并且分别更改其显示文本为“进入主界面”和“退出程序”。
第二步设计信号和槽。
1.实现“退出程序”按钮的信号和槽的关联。点击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4,便进入了部件的信号和槽的编辑模式(快捷键F3从编辑控件回到部件编辑模式)。在“退出程序”按钮上按住鼠标左键,然后拖到到窗口界面上,这时松开鼠标左键。在弹出的配置连接对话框中选择“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择clicked(),在右边的QDialog栏中选择对应的槽Close(),完成后单击“确定”。
2.现在设置“进入主界面”按钮的信号和槽的关联。在该按钮上右击,在弹出的菜单上选择“转到槽”,然后在弹出的对话框中选择clicked()信号,并单击“确定”,便会进入代码编辑模式,并且定位到自动生成的on_pushButton_cliked()槽中。在其中添加代码:
void MyDialog::on_pushButton_clicked()
{
accept();
}
这个accept()函数是QDialog类中的一个槽。一个使用exec()函数实现的模态对话框执行了这个槽就会隐藏这个模态对话框,并返回QDialog::Accepted值,这里就是要使用这个值来判断是哪个按钮被按下了。
3.在主界面中使用自定义的对话框
更改Main.cpp函数内容如下:
#include 《QtGui/QApplication>
#include "mywidget."
#include "mydialog.h"
int main(int argc,char * argv[]);
{
QApplication a(argc,argv);
MyWidget w;
MyDialog dialog;
if(dialog.exec() == QDialog::Accepted){
w.show();
return a.exec();
}
else return 0;
}
在主函数中建立了MyDialog对象,然后判断其exec()函数的返回值,如果是按下了“进入主界面”按钮,囊二返回值应该是QDialog::Accepted,显示主界面,并且正常执行程序;如果不是,则直接退出程序。
现在程序可以实现了从登录对话框到主界面,再从主界面显示一个对话框的应用。再来实现可以从主界面重新进入登录界面的功能。双击mywidget.ui文件,再设置模式上再向界面上添加两个Push Button,分别更改它们的显示文本为“重新登陆”,“退出”好设置,现在看重新登录按钮的clicked()信号的槽。
void MyWidget::on_pushButton_clicked()
{
//先关闭主界面,其实它是隐藏起来了,并没有真正退出。然后新建MyDialo对象
close();
Mydialog dlg;
if(dlg.exec() == QDialog::Accepted)
show();
}
需要说明的是那个close()槽,它不一定使程序退出,只有当只剩下最后一个主界面(也就是没有父窗口的界面)时调用close()槽,程序才会退出;其他情况下界面只是隐藏起来了,并没有被销毁。