Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)相关的知识,希望对你有一定的参考价值。

 之前的 Qt 编程大多只涉及简单的多窗口,并未染指窗口间的传值交互,想来还是“涉世未深”,对 Qt 的理解、应用还需殷勤努力。


这次的问题是这样的,我想要实现一个类似QQ、阿里旺旺的聊天客户端,在弹出表情对话框后,能够选择表情并返回给聊天窗口的消息输入框,这就需要两个窗口之间的传值交互。
 
首先想到的解决方法自然是使用Qt自带的signal/slot机制。即首先发信号给父窗口,父窗口接到信号执行槽函数发送一个携带所需数据的信号给子窗口。但是疑问来了:要在子窗口中接收到父窗口的信号必须进行signal和slot的绑定。这需要主窗口类的定义(1)。担心头文件的递归包含,我们只好再想另外一个方法。直接在子窗口中利用指向父窗口的指针来访问父窗口类的成员怎么样?
 
说做就做,先写一个测试代码来试试。
 
mainwindow.ui 中有一个lineedit和pushbutton,点击之后弹出Dialog实例;dialog.ui 中有一个pushbutton,点击之后修改mainwindow中的lineedit的文本内容。
 
代码如下:
 
(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();

 void setLineText(QString str);

private slots:
 void on_pushButton_clicked();

private:
 Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 
 
(2) mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "ui_dialog.h"

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

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

void MainWindow::on_pushButton_clicked()
{
 Dialog subwin(this); //"this" is very important.
 subwin.setGeometry(x()-100, y()+100, wifth()-100, height()-100);
 subwin.exec(); //needed.
}

void MainWindow::setLineText(QString str)
{
 ui->lineEdit->setText(str);
}

 
(3) dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
 Q_OBJECT

public:
 explicit Dialog(QWidget *parent = 0);

 ~Dialog();

private slots:
 void on_pushButton_clicked();

private:
 Ui::Dialog *ui;
};

#endif // DIALOG_H

 
(4) dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void Dialog::on_pushButton_clicked()
{
 MainWindow *ptr = (MainWindow*)parentWidget();  //"parentWidget" very important. 获得父部件指针,同时需要类型强转.
 ptr->setLineText("i can do it, too.");
 close();
}

http://blog.csdn.net/jan5_reyn/article/details/38955707

以上是关于Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)的主要内容,如果未能解决你的问题,请参考以下文章

qt把子窗口放进父窗口的widget里

Qt如何不让父窗口的颜色影响子窗口

关于Qt子窗口和父窗口的问题

[QT]MdiArea子窗口的管理,拦截子窗口关闭消息并在父窗口处理

MFC中怎么让子窗体大小随着父窗口的大小变化而改变?

QT在子窗体中控制父窗体