【Qt编程】Qt学习之窗口间的相互切换

       转载自:http://www.noobyard.com/article/p-twurtihl-c.html

        在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口。下面我们来介绍具体的实现方法:

工程建立及功能描述:

        首先,我们建立Qt  Gui应用,项目名TwoWindowsHandoff(可以随便取),基类选择QMainWindow。然后右击项目,添加Qt设计器界面类,类名取为logindialog。我们在这里假设一个窗口是登录对话框,另一个窗口是主界面;登录对话框有两个按钮,分别更改显示文本为login,exit;主界面也有两个按钮,分别更改显示文本为relogin,quit.。我们最终的实现功能是:程序运行时,出现登录对话框,点击login按钮进入主界面且登录对话框消失;在主界面点击relogin按钮回到登录对话框且主界面消失,点击exit按钮或quit按钮都会退出程序。

编程思想:

        我们可以通过Qt Designer来在两个窗口上分别添加上述按钮,这里不在详细描述。我们主要的问题是如何设计信号和槽。我们先设计两个窗口的退出按钮:分别右击exit和quit按钮,转到槽,在槽函数中发射quit()信号,然后将信号与QApplication对象的quit()槽函数关联。这样我们就设计好了两个退出按钮的退出操作。对于login按钮,我们在其槽函数中发射showmainwindow()信号,隐藏对话框,然后在主窗口类中定义对应的槽函数receivelogin(),在该函数中我们应该显示主窗口。同理对于relogin窗口,我们在其槽函数中发射dlgshow()信号,隐藏主窗口,然后在登录对话框类中定义对应的槽函数receivelshow(),在该函数中我们应该显示登录对话框。

具体的程序实现如下:

1.头文件:

  mainwindow.h文件:

[cpp]  view plain  copy
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5.   
  6.   
  7.   
  8. namespace Ui {  
  9. class MainWindow;  
  10. }  
  11.   
  12. class MainWindow : public QMainWindow  
  13. {  
  14.     Q_OBJECT  
  15.       
  16. public:  
  17.     explicit MainWindow(QWidget *parent = 0);  
  18.     ~MainWindow();  
  19.       
  20. private:  
  21.     Ui::MainWindow *ui;  
  22.   
  23. private slots:  
  24.     void receivelogin();//与login中发射的信号关联的槽函数  
  25.     void on_pushButton_clicked();//与relogin的click()关联的槽函数  
  26.   
  27.     void on_pushButton_2_clicked();//与quit的click()关联的槽函数  
  28.   
  29. signals:  
  30.     void dlgshow();//显示登录对话框信号  
  31.     void quit();//退出信号  
  32.   
  33.   
  34. };  
  35.   
  36. #endif // MAINWINDOW_H  

mydialog.h文件:

[cpp]  view plain  copy
  1. #ifndef MYDIALOG_H  
  2. #define MYDIALOG_H  
  3. #include <QDialog>  
  4. namespace Ui {  
  5. class MyDialog;  
  6. }  
  7. class MyDialog : public QDialog  
  8. {  
  9.     Q_OBJECT  
  10.       
  11. public:  
  12.     explicit MyDialog(QWidget *parent = 0);  
  13.     ~MyDialog();  
  14.       
  15. private slots:  
  16.     void on_pushButton_clicked();//与login关联的槽函数  
  17.     void receiveshow();//与relogin中发射的信号关联的槽函数  
  18.     void on_pushButton_2_clicked();//与exit关联的槽函数  
  19. signals:  
  20.     void showmainwindow();//显示主窗口信号  
  21.     void quit();//退出信号  
  22. private:  
  23.     Ui::MyDialog *ui;  
  24. };  
  25. #endif // MYDIALOG_H  

2.源文件:

main.cpp文件:

[cpp]  view plain  copy
  1. #include <QtGui/QApplication>  
  2. #include "mainwindow.h"  
  3. #include"mydialog.h"  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     MainWindow w;  
  9.     MyDialog dlg;  
  10.     dlg.show();  
  11.     //信号与槽之间进行关联  
  12.     QObject::connect(&dlg,SIGNAL(showmainwindow()),&w,SLOT(receivelogin()));  
  13.     QObject::connect(&w,SIGNAL(dlgshow()),&dlg,SLOT(receiveshow()));  
  14.     QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit()));  
  15.     QObject::connect(&dlg,SIGNAL(quit()),&a,SLOT(quit()));  
  16.     return a.exec();  
  17. }  


mainwindow.cpp文件:

[cpp]  view plain  copy
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include<QPushButton>  
  4. #include<QHBoxLayout>  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) :  
  7.     QMainWindow(parent),  
  8.     ui(new Ui::MainWindow)  
  9. {  
  10.     ui->setupUi(this);//默认是类名  
  11.     setWindowTitle(tr("myMainWindow"));  
  12.   
  13. }  
  14.   
  15. MainWindow::~MainWindow()  
  16. {  
  17.     delete ui;  
  18. }  
  19.   
  20. void MainWindow::receivelogin()  
  21. {  
  22.     this->show();//显示主窗口  
  23. }  
  24.   
  25. void MainWindow::on_pushButton_clicked()  
  26. {  
  27.     this->hide();//隐藏主窗口  
  28.     emit dlgshow();//发射显示登录对话框信号  
  29. }  
  30.   
  31. void MainWindow::on_pushButton_2_clicked()  
  32. {  
  33.     emit quit();//发射退出信号  
  34. }  


mydialog.cpp文件:

[cpp]  view plain  copy
  1. #include "mydialog.h"  
  2. #include "ui_mydialog.h"  
  3. #include<QHBoxLayout>  
  4. #include<mainwindow.h>  
  5.   
  6. MyDialog::MyDialog(QWidget *parent) :  
  7.     QDialog(parent),  
  8.     ui(new Ui::MyDialog)  
  9. {  
  10.     ui->setupUi(this);  
  11.   
  12. }  
  13.   
  14. MyDialog::~MyDialog()  
  15. {  
  16.     delete ui;  
  17. }  
  18.   
  19. void MyDialog::on_pushButton_clicked()  
  20. {  
  21.     this->hide();//隐藏登录对话框  
  22.     emit showmainwindow();//显示主窗口  
  23. }  
  24.   
  25.   
  26. void MyDialog::receiveshow()  
  27. {  
  28.     this->show();//显示登录对话框  
  29.   
  30. }  
  31.   
  32. void MyDialog::on_pushButton_2_clicked()  
  33. {  
  34.     emit quit();//发射退出信号  
  35. }  

3.ui文件(窗口设计)





原文:http://blog.csdn.net/tengweitw/article/details/21275721

作者:nineheadedbird