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();
}
 



<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值