QT 窗体间通信

来源:互联网 发布:数据库原理pdf百度云 编辑:程序博客网 时间:2024/06/07 06:52

多窗体的实现我们可以在

1:在一个创体内控制另一个窗体显示(信号,槽的使用)

2:在一个窗体内触发另一个窗体内的信号,槽,函数 (信号,槽的使用)
3,在一个创体内修改另一个创体内部件的属性,值等

(指针使用)


方法
1----------main函数中控制 a.show   b.show(通过accept判断,下面将不再介绍此方法)
2-----------也可以用一个窗体的信号或槽来控制另一个窗体的显示和部件属性以及值





实例1---------------

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QMainWindow>
#include "Form1.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void hide_main();
    void show_main();
private:
    Ui::MainWindow *ui;
    Form1  form1;

};


#endif // MAINWINDOW_H


mainwindow.cpp
..............
....
void MainWindow::hide_main()
{
    form1.show();
    this->hide();
}
void MainWindow::show_main()
{
    this->show();
}
......
...


#ifndef Form1_H
#define Form1_H
#include <QWidget>
namespace Ui {
    class Form1;
}

class Form1 : public QWidget
{
    Q_OBJECT
public:
    explicit Form1(QWidget *parent = 0);
    ~Form1();
public slots:
    void hide_form1();
signals:
    void t();
private:

    Ui::Form1 *ui;

};
#endif


form1.cpp
......
.........
void Two::hide_form1()
{
    emit t();
    this->hide();
}
...........

实例2-----------------------


1.建立一个工程

2.新建一个mainForm对话框
 向其中添加几个按钮,其中的一个按钮show的功能是在mainForm中点击一个该按钮就能弹出另外一个窗体
showForm
3.创建一个main.cpp,将其主要窗体选为mainForm,则会自己创建一个已经写好了相关语句的main.cpp。


3.新建另外一个对话框showForm,将其属性中的name改为showForm,将该对话框保存为showForm.ui
4.在mainForm的member项中的includes(in declaration)中加入"showForm.h",在Class varible中添加showForm *showForm;
5.将show按钮的click()信号与mainForm的一个新建的slot(showSlot)连接起来;
6.为showSlot()添加代码如下:
void mainForm::showSlot()
{
showform=new showForm(this);
showform->show();
}
7.qmake
make
这样就会生成可执行文件。

实例3-----------------------

Qt中不允许定义全局变量,我们无法简单地实现窗体之间的传值,例如 弹出式登录框.. 可以利用信号槽机制实现传值,QInputDialog 貌似也是这么实现的。

http://blog.sina.com.cn/s/blog_511cc1eb0100t00i.html

    首先构造两个对话框类Parent 和 Child,其界面如下:
【原创】Qt <wbr>窗体之间通信

//parent.h
先载入child.h
class Parent : public QDialog
{
    Q_OBJECT
public:
    Parent();
    QLineEdit *lineEdit;
    QLabel *pLabel;
    QPushButton *childBtn;
    QPushButton *qBtn;
    Child *c;                                  //子窗体

public slots:
    void infoRecv(const QString &); //消息接收 槽函数
    void childCreate();                    //创建子窗体 槽函数

};

//parent.cpp
Parent::Parent()
{
    setWindowTitle("Parent");

    lineEdit = new QLineEdit;
    pLabel = new QLabel("infoRecv: ");
    childBtn = new QPushButton("childUi");
    qBtn = new QPushButton("Quit");

    QGridLayout *layout = new QGridLayout(this);
    layout->addWidget(pLabel,0,0);
    layout->addWidget(lineEdit,0,1);
    layout->addWidget(childBtn,1,0);
    layout->addWidget(qBtn,1,1);
    c = new Child();
    this->resize(300,200);
    connect(qBtn,SIGNAL(clicked()),this,SLOT(reject()));  //关闭主窗体
    connect(childBtn,SIGNAL(clicked()),this,SLOT(childCreate())); //创建子窗体
    connect(c,SIGNAL(infoSend(const QString &)),
                           this,SLOT(infoRecv(const QString &))); //消息发送与接收


}

void Parent::childCreate()
{

    c->exec();
}

void Parent::infoRecv(const QString &str)
{
    lineEdit->setText(str);
}

【原创】Qt <wbr>窗体之间通信


//child.h

class Child : public QDialog
{
    Q_OBJECT
public:
    Child();
    QLineEdit *lineEdit;
    QLabel *pLabel;
    QPushButton *tBtn;
    QPushButton *qBtn;
signals:
    void infoSend(const QString &); //定义消息发送信号
public slots:
    void emit_signal_infosend();      //Send按钮单击事件连接的槽函数,目的为发射infoSend信号

};

//child.cpp
Child::Child()
{
    setWindowTitle("Child");

    lineEdit = new QLineEdit;
    pLabel = new QLabel("infoSend: ");
    tBtn = new QPushButton("Send");
    qBtn = new QPushButton("Quit");

    QGridLayout *layout = new QGridLayout(this);
    layout->addWidget(pLabel,0,0);
    layout->addWidget(lineEdit,0,1);
    layout->addWidget(tBtn,1,0);
    layout->addWidget(qBtn,1,1);

    this->resize(300,200);

    connect(qBtn,SIGNAL(clicked()),this,SLOT(close()));
    connect(tBtn,SIGNAL(clicked()),this,SLOT(emit_signal_infosend()));

}

void Child::emit_signal_infosend()
{
    const QString txt = lineEdit->text();
    emit infoSend(txt);
}

结果如下图

原创粉丝点击