在用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文件:

#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

2.源文件:

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();//发射退出信号
}

3.ui文件(窗口设计)

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

作者:nineheadedbird

【Qt编程】Qt学习之窗口间的相互切换的更多相关文章

  1. Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用

    Extjs Ext.ux.IFrame的用法 以及父子窗口间函数相互调用 Ext.ux.IFrame Extjs官方提供的一个组件,可以很方便的使用. 这样就完成了一个简单的IFrame的使用,通过E ...

  2. Qt编程之实现属性窗口编辑器

    类似于这种: 就是右下角这个框,有属性名字和对应的value编辑. 这个Widget是作为一个QDockWidget被添加到QMainWindow中的.QMainWindow必须要有centralWi ...

  3. C# WPF 通过委托实现多窗口间的传值

    在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值. 在上代码之前呢,先简单介绍一下什么是C#中的委托(如果只想了解如 ...

  4. Qt编程—去掉标题栏和设置窗口透明用法

    学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧. 这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后) 代码实现部分: .h文 ...

  5. Qt编程学习网站

    http://blog.csdn.net/k122769836/article/details/8637677 QT - little_su - 博客频道 - CSDN.NET Qt - 1+1=2 ...

  6. QT学习之窗口右键菜单

    #QT学习之窗口右键菜单 QWidget 及其子类都有右键菜单,主要因为其有两个与右键菜单相关联的函数: Qt::ContextMenuPolicy contextMenuPlicy() const ...

  7. 学习 Qt 编程的好书精品推荐!

    最近一段时间,准备开始搞Qt方面的东西,想找几本书看看.网上介绍QT的书籍也有很多,不想浪费时间,所以想找几本精品的书籍来看.花了半天的时间找了几本非常不错的,这里面整理好之后推荐给大家! 下面介绍的 ...

  8. 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动

    在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...

  9. Qt学习3---子窗口与父窗口

    创建子窗口后,主窗口的头文件需要  #include "子窗口头文件" 子窗口和父窗口之间相互切换 子窗口没有办法处理父窗口,子窗口此时就需要一个信号: * 信号必须有signal ...

随机推荐

  1. RxJava(11-线程调度Scheduler)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51821940 本文出自:[openXu的博客] 目录: 使用示例 subscribeOn原理 ...

  2. Ubuntu Intel显卡驱动安装 (Ubuntu 14.04--Ubuntu 16.10 + Intel® Graphics Update Tool)

    最近使用在使用Ubuntu时,发现大部分情况下,不安装显卡驱动,使用默认驱动,都是没有问题的,但对于一些比较奇特配置的电脑,如下所示,如果使用默认驱动,会时常莫名其妙死机crash,尤其是在使用Ope ...

  3. linux 服务器网络有关的内核参数

    几乎所有的内核模块,包括内核核心模块和驱动程序,都在/proc/sys 文件系统下提供了某些配置文件以提供用户调整模块的属性和行为.通常一个配置文件对应一个内核参数,文件名就是参数的名字,文件的内容是 ...

  4. [ExtJS5学习笔记]第二十七节 CMD打包错误 Error C2009: YUI Parse Error (identifier is a reserved word => debugger;)

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/41242993 本文作者:sushengmiyan ------------------ ...

  5. Android传感器

    Android传感器 开发传感器应用 1. 获取传感器管理者对象 // 获取传感器管理者对象 SensorManager mSensorManager = (SensorManager) getSys ...

  6. 关于Lt分发系统的时序图分析

    我们已经知道,系统共分为两个模块,mather与son 同时系统允许的操作也有三种,向mather提交war包,我某个服务器更新代码,为所有服务器更新代码 我们一个一个来看 先说,向mather提交w ...

  7. 剑指Offer——Trie树(字典树)

    剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种的单词.对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位 ...

  8. 3.QT事件处理,消息过滤器

     1  新建一个项目:06Event 新建cpp文件 06Event.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += wid ...

  9. 6.1、Android Studio的Android Monitor概览

    Android Monitor帮助你监测你的应用的性能,以帮助你合理的进行优化,调试,提升.如下功能: 1. Log消息,系统定义的或者开发者定义的. 2. 内存,CPU和GPU使用情况. 3. 网络 ...

  10. Android ListPopupWindow的使用

    其实像ListPopupWindow.PopupMenu的用法大致和PopupWindow的一样!就不讲了,相信用过PopupWindow的看一下就能明白. 先上个效果图: ListPopupWind ...