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

时间:2023-03-08 23:52:21
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.****.net/jan5_reyn/article/details/38955707