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

时间: 2024-12-26 03:14:22

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

JS子窗口调用父窗口的方法

有两种情况: 一,框架(iframe)形式,这时用到是window.parent,详情如下: 1,1.html代表的是父窗口 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/

JavaScript子窗口调用父窗口变量和函数的方法

在做一个父窗口开启子窗口并且在子窗口关闭的时候调用父窗口的方法,达到局部刷新的目的. 父窗口: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns=" http://www.w3.org/1999/xhtml&qu

子窗口调用父窗口

相信学计算机的大学生都碰过这样的编程作业吧…… “程序运行后主窗口隐藏,然后弹出登录框,输入账号密码登陆成功后再关闭登陆框,然后让之前隐藏的主窗口重新显示.” 没错,我当时就是这么笨,怎么都想不到好的解决办法……当时的同学都是不管之前隐藏的主窗口,而是直接新建了一个主窗口…… 刚好昨晚在做项目时碰到类似的情况,就在这写一个超级简单的方法吧…… private void img_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {

子窗口调用父页面js实例

父页面代码: <%@ page contentType="text/html; charset=GBK"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <title>new_page_title</title> <script type="

window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口

window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口 项目中经常遇到一个业务逻辑:在A窗口中打开B窗口,在B窗口中操作完以后关闭B窗口,同时自动刷新A窗口(或局部更新A窗口)(或将数据传回A窗口) 以下是从实际项目中截取出来和window.open()方法相关的代码,业务逻辑如下: 1. 点击父窗口的div标签(id="addMatchSchedule"),出发点击事件,打开子窗口: 2. 点击子窗口的button按钮,触发点击时间,即调用addSchduleI

js子窗口修改父窗口内容

在框架中,我用 JavaScript 获取 JSON 数据,组织成 HTML 代码,最后将其填充至上层文档的一个元素中.按照一般的写法,我们需要用到类似如下的语句: 1.window.parent.document.getElementById("myEle").innerHTML = html; 使用 jQuery ,写法如下: 1.$("#myEle", window.parent.document).html(html); 即指明了是在 window.pare

JS 子窗口向父窗口传值

首先我们来了解下window对象的的方法open: 1,open() 方法用于打开一个新的浏览 window.open(URL,name,features,replace) 重要事项:请不要混淆方法 Window.open() 与方法 Document.open(),这两者的功能完全不同.为了使您的代码清楚明白,请使用 Window.open(),而不要使用 open(). 2,opener opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用.---这句话怎么

MFC子窗口和父窗口

MFC子窗口和父窗口(SetParent,SetOwner) 分类: VC++学习2012-08-17 16:55 553人阅读 评论(0) 收藏 举报 mfclist数据结构nullwindowshierarchy 转自: http://hi.baidu.com/winnyang/blog/item/c4fdcd3698b33ad1a2cc2b79.html一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口

frameset子窗口获取父窗口失败原因?

报错信息: arrow.html:44 Uncaught SecurityError: Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match. 报错代码: 1 $(".main").click( function() { 2 var tartget = window