Qt窗口间的相互切换

  在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口。下面来介绍具体的实现方法。
  首先建立QtGui应用,项目名是TwoWindowsHandoff,基类选择QMainWindow。然后右击项目,添加Qt设计器界面类,类名取为logindialog。我们在这里假设一个窗口是登录对话框,另一个窗口是主界面;登录对话框有两个按钮,分别更改显示文本为loginexit;主界面也有两个按钮,分别更改显示文本为reloginquit。我们最终的实现功能是:程序运行时,出现登录对话框,点击login按钮进入主界面且登录对话框消失;在主界面点击relogin按钮回到登录对话框且主界面消失,点击exit按钮或quit按钮都会退出程序。
  我们可以通过Qt Designer来在两个窗口上分别添加上述按钮,主要的问题是如何设计信号和槽。我们先设计两个窗口的退出按钮:分别右击exitquit按钮,转到槽,在槽函数中发射quit信号,然后将信号与QApplication对象的quit槽函数关联,这样就设计好了两个退出按钮的退出操作。对于login按钮,我们在其槽函数中发射showmainwindow信号,隐藏对话框,然后在主窗口类中定义对应的槽函数receivelogin,在该函数中应该显示主窗口。同理,对于relogin窗口,我们在其槽函数中发射dlgshow信号,隐藏主窗口,然后在登录对话框类中定义对应的槽函数receivelshow,在该函数中应该显示登录对话框。具体的程序实现如下:
  mainwindow.h如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    explicit MainWindow ( QWidget *parent = 0 );
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private slots:
    void receivelogin(); /* 与login中发射的信号关联的槽函数 */
    void on_pushButton_clicked(); /* 与relogin的click关联的槽函数 */
    void on_pushButton_2_clicked(); /* 与quit的click关联的槽函数 */
signals:
    void dlgshow(); /* 显示登录对话框信号 */
    void quit(); /* 退出信号 */
};

#endif // MAINWINDOW_H

  mydialog.h如下:

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
    class MyDialog;
}

class MyDialog : public QDialog {
    Q_OBJECT
public:
    explicit MyDialog ( QWidget *parent = 0 );
    ~MyDialog();
private slots:
    void on_pushButton_clicked(); /* 与login关联的槽函数 */
    void receiveshow(); /* 与relogin中发射的信号关联的槽函数 */
    void on_pushButton_2_clicked(); /* 与exit关联的槽函数 */
signals:
    void showmainwindow(); /* 显示主窗口信号 */
    void quit(); /* 退出信号 */
private:
    Ui::MyDialog *ui;
};
#endif // MYDIALOG_H

  main.cpp如下:

#include <QtGui/QApplication>
#include "mainwindow.h"
#include "mydialog.h"

int main ( int argc, char *argv[] ) {
    QApplication a ( argc, argv );
    MainWindow w;
    MyDialog dlg;
    dlg.show();
    /* 信号与槽之间进行关联 */
    QObject::connect ( &dlg, SIGNAL ( showmainwindow() ), &w, SLOT ( receivelogin() ) );
    QObject::connect ( &w, SIGNAL ( dlgshow() ), &dlg, SLOT ( receiveshow() ) );
    QObject::connect ( &w, SIGNAL ( quit() ), &a, SLOT ( quit() ) );
    QObject::connect ( &dlg, SIGNAL ( quit() ), &a, SLOT ( quit() ) );
    return a.exec();
}

  mainwindow.cpp如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QHBoxLayout>

MainWindow::MainWindow ( QWidget *parent ) : QMainWindow ( parent ), ui ( new Ui::MainWindow ) {
    ui->setupUi ( this ); /* 默认是类名 */
    setWindowTitle ( tr ( "myMainWindow" ) );
}

MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::receivelogin() {
    this->show(); /* 显示主窗口 */
}

void MainWindow::on_pushButton_clicked() {
    this->hide(); /* 隐藏主窗口 */
    emit dlgshow(); /* 发射显示登录对话框信号 */
}

void MainWindow::on_pushButton_2_clicked() {
    emit quit(); /* 发射退出信号 */
}

  mydialog.cpp如下:

#include "mydialog.h"
#include "ui_mydialog.h"
#include <QHBoxLayout>
#include <mainwindow.h>

MyDialog::MyDialog ( QWidget *parent ) : QDialog ( parent ), ui ( new Ui::MyDialog ) {
    ui->setupUi ( this );
}

MyDialog::~MyDialog() {
    delete ui;
}

void MyDialog::on_pushButton_clicked() {
    this->hide(); /* 隐藏登录对话框 */
    emit showmainwindow(); /* 显示主窗口 */
}

void MyDialog::receiveshow() {
    this->show(); /* 显示登录对话框 */
}

void MyDialog::on_pushButton_2_clicked() {
    emit quit(); /* 发射退出信号 */
}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值