当前位置:文档之家› Qt界面编程:窗口传值方式

Qt界面编程:窗口传值方式

Qt界面编程:窗口传值方式
Qt界面编程:窗口传值方式

1、问题

一个这样的场景:主窗口界面有一个菜单项,点击该菜单项弹出一个对话框。点击对话框上的测试按钮,显示主窗口类中的一个字符串成员的内容。这就是整个窗口传值的需求描述。如何解决呢?首先想到的解决方法自然是使用Qt 自带的signal/slot机制。即首先发信号给父窗口,父窗口接到信号执行槽函数发送一个携带所需数据的信号给子窗口。但是疑问来了:要在子窗口中接收到父窗口的信号必须进行signal和slot的绑定。这需要主窗口类的定义(1)。担心头文件的递归包含,我们只好再想另外一个方法。直接在子窗口中利用指向父窗口的指针来访问父窗口类的成员如何?但是,这显然也牵涉到了头文件的递归包含(2)。但,不试一试怎么知道?毕竟很多事情是无法用理论来解释的。

2、尝试解决

?使用环境:Qt5.0, Qt creator2.6, Windows XP sp3 32bit

?创建一个主窗口类和子窗口类,在主窗口类中声明一个QString类型的成员变量,访问权限设置为public(3),并在构造函数中进行初始化

?在子窗口增加一个QLabel组件,用于显示父窗口的成员变量的内容。

?在父类中调用子类弹出子窗口时,要给子窗口的构造函数传递this指针,以设置子窗口的父窗口。因为子窗口的构造函数带一个默认值0,也即是没有设置父窗口的。

3、代码

//主窗口的.h文件,头文件和预处理机制已经去掉

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private slots:

void on_actionPopup_triggered();

private:

Ui::MainWindow *ui;

QString name; //declaration

};

//主窗口的cpp实现文件,其他同上

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

name = "YES"; //initialization of member variable }

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::on_actionPopup_triggered()

{

Dialog myDlg(this); //This is important

myDlg.exec();

}

//Dialog header

namespace Ui {

class Dialog;

}

class Dialog : public QDialog

{

Q_OBJECT

public:

explicit Dialog(QWidget *parent = 0);

~Dialog();

private slots:

void on_pushButton_test_clicked();

private:

Ui::Dialog *ui;

};

//dialog implementation

Dialog::Dialog(QWidget *parent) :

QDialog(parent),

ui(new Ui::Dialog)

{

ui->setupUi(this);

}

Dialog::~Dialog()

{

delete ui;

}

void Dialog::on_pushButton_test_clicked()

{

MainWindow* ptr = (MainWindow*)parentWidget(); //conversion

ui->label->setText(ptr->name);

}

4、解释

注意上面的指针转换,MainWindow* ptr = (MainWindow*)parentWidget();,这句话首先调用parentWidg et()获得子窗口的父窗口指针,其类型为QWidget类型,故此需要强制转换为MainWindow类型。所以在子窗口的头文件的中必须要包含主窗口的头文件,否则连编译都无法通过。其次是在父窗口中调用的方式:Dialog myDlg(t his); myDlg.exec();必须要传递this指针给子窗口的构造函数进行初始化。否则,parentWidget()将无法取得父窗口的指针。

5、新问题

1.头文件包含问题(上面1,2所标示)。在父窗口的头文件中,包含了子窗口的头文件。这原本没有问题。但

是在子窗口中又再次包含了父窗口的头文件,这一样一来彼此包含,你中有我我中有你,生生不息了。为什么能这样工作呢?是不是头文件的预编译机制突破了这一限制?

2.上面3所标识的问题,其实并没有严格的要求,至少在Qt Creator中没有这样的限制。你可以将该成员变

量设置为private,protected, public的,但是在子窗口中照样能访问。虽然按照C++的设计原则来说,数据应该是类的私有部分。这到底是为什么呢?

QT中的网络编程实例

QT中的网络编程实例 Qclient.h /**************************************************************************** ** $Id: /sample/10/qclient.h 2.3.2 edited 2004-10-12 $ ** ** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved. ** https://www.doczj.com/doc/d61731230.html, ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef QCLIENT_H #define QCLIENT_H #include #include #include #include #include #include #include #include #include class QClient : public QWidget { Q_OBJECT public: QClient(QWidget *parent = 0, const char *name = 0); private slots: void closeConnection(); void sendToServer(); void connectToServer(); void socketReadyRead(); void socketConnected(); void socketConnectionClosed(); void socketClosed(); void socketError(int); private: QSocket *socket; QTextView *infoText;

嵌入式Linux下用Qt Designer开发及实例

嵌入式Linux用Qt Designer快速开发 RAD(快速应用程序开发)是一种高效的软件开发形式,可以让用户在极短的时间里创建一个图形化的用户界面。通常情况下,在一张空白的表单上,开发人员可以通过拖拉或点击的方式,在窗口的适当位置上添加一些输入框和按钮等窗口组件。这时,RAD工具会自动编写和维护代码。而用户所要做的只是确定当点击按钮或选择选单选项时将要发生什么事件。 在Linux下,一个非常流行的RAD工具就是Qt Designer。它是嵌入式公司Trolltech 的Qt软件包的一个组成部分。如果用户使用的是KDE桌面,那么Qt已经自动安装上了,Qt Designer也很有可能已经被安装好。如果用户的系统没有安装,那么针对不同的版本,可以很方便地找到KDE Development Tools,并安装之。以Red Hat 9.0为例,用户可以从主选单→系统设置→添加/删除应用程序中选择KDE 软件开发,即可完成Qt Designer的安装(如图1所示)。 图1 安装Qt Designer 创建 为了快速地向大家展示一下Qt Designer功能,先创建一个简单的摄氏温度和华氏温度的转换程序。本文里将设计一个简单的GUI,并且添加一些简单的代码来实现温度的转换。因为是为了展示一下快速的开发过程,而不是一个严谨的软件项目的开发,所以这里不会进行任何的错误检查,也不进行输入检验(也就是检查用户的输入是否为合法的温度形式)、缓冲溢出检查等在日常软件开发中一定要做的步骤。

如果用户使用的是KDE,那么选单上应该已经有Qt Designer的图标。不同的发行版,图标的位置会有所不同。如果用户的发行版没有Qt Designer图标,那么可以在命令行模式下输入“designer”命令来启动该开发工具。在Red Hat 9.0中,可以通过点击主选单→编程→更多编程工具→Qt Designer来启动(如图2)。 图2 启动Qt Designer Qt Designer首先呈现给用户的是一个New/Open对话框(如图3所示)。因为这里要创建一个C++程序,所以在此选择C++ Project,点击“OK”继续。 图3 New/Open对话框 选择一个想要保存文件的位置,并且给出一个文件名,在此使用的文件名是cfconv。注意这里文件名的扩展名一定要是.pro。点击“Save”后,返回到了Project

让Qt应用程序只运行一个实例 - 开源中国社区

首页 开源项目 Java 开源软件 C# 开源软件 PHP 开源软件 C/C++ 开源软件 Ruby 开源软件 Python 开源软件 Go开源软件 JS开源软件 问答 技术问答 ? 技术分享 ? IT大杂烩 ? 职业生涯 ? 站务/建议 ? 支付宝专区 ? MoPaaS专区 ? 开源硬件专区 ? 代码 博客 翻译 资讯 移动开发 Android开发专区 iOS开发专区 iOS代码库 Windows Phone 招聘 城市圈 你还没加入城市圈 全部城市圈xuyanghpu,您好 我的空间 站内留言 我的讨论记录 我分享的代码 我的博客 我关注的人 我的收藏夹 个人资料修改 更改我的头像 | 添加软件 | 投递新闻 | 退出开源中国 代码分享 当前位置:

分享到: 收藏 +15踩顶0[全屏查看所有代码]代码分享 ? C/C++ ? 图形界面开发/GUI/CGI 资讯、软件、分享、代码、搜 索 让Qt应用程序只运行一个实例 鉴客 发布于 2010年10月21日 17时, 2评/5284阅 在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直接调用系统API,肯定可以做到,但是我们希望找到一个跨平台的通用的解决方案。这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket 实现,而在Windows上则采用有名管道(named pipe)来实现。 既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。 这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个YourOwnApplication,然后在构造函数中进行,下面是一个示意。 首先是YourOwnApplication构造函数: 标签: QApplicaiton QLocalSocket QLocalServer Qt 代码片段(1) 1. [代码]cpp代码 1234567891011121314151617Q S t r i n g s e r v e r N a m e = Q C o r e A p p l i c a t i o n ::a p p l i c a t i o n N a m e (); Q L o c a l S o c k e t s o c k e t ;s o c k e t .c o n n e c t T o S e r v e r (s e r v e r N a m e ); i f (s o c k e t .w a i t F o r C o n n e c t e d (500)) { //如果能够连接得上的话,将参数发送到服务器,然后退 Q T e x t S t r e a m s t r e a m (&s o c k e t ); Q S t r i n g L i s t a r g s = Q C o r e A p p l i c a t i o n ::a r g u m e n t s (); i f (a r g s .c o u n t () > 1) s t r e a m << a r g s .l a s t (); e l s e s t r e a m << Q S t r i n g (); s t r e a m .f l u s h (); s o c k e t .w a i t F o r B y t e s W r i t t e n (); q A p p ->q u i t (); ?

Qt界面美工实例

Qt StyleSheet样式表实例 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表。 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计。自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑器的背景变为黄色,下面是代码行: qApp->setStyleSheet("QLineEdit { background-color: yellow }"); 针对一个对话框的内容中使用QLineEdit以及QLineEdit的子类的背景都变成黄色,下面是代码: myDialog ->setStyleSheet("QLineEdit { background-color: yellow }"); 如果只需要制定一个QLineEdit的内容,将使用QObject::setObjectName() 下面是一个实例: myDialog->setStyleSheet("QLineEdit#nameEdit { background-color: yellow }"); 同时也可以针对每一个指定的部件做直接的类型设置,下面是一个实例: https://www.doczj.com/doc/d61731230.html,Edit->setStyleSheet("background-color: yellow"); 为了做一个鲜明的对比,将要为文本设置合适的颜色。 nameEdit->setStyleSheet("color: blue; background-color: yellow"); 当然最好的办法还有针对选择的文本来进行设置,下面设置了一个选择文本的类型属性:nameEdit->setStyleSheet("color: blue;" "background-color: yellow;" "selection-color: yellow;" "selection-background-color: blue;"); 在有一些情况下,不需要用户参与,而有软件设计人员来自己制定样式,即使这些是有违审美角度。下面就从应用程序开发角度来设计样式。 *[mandatoryField="true"] { background-color: yellow } 上面的意思是一些强制的区域是需要用Qt 的属性管理来强制设置成为黄色的背景。 这样一些强制的部件,将需要通过函数来设置当前的属性已经被强制设置,下面是实现的代码:

如何在Qt中使用Qt 3D开发程序

如何使用Qt 3D开发3D场景程序? 目前Qt已经提供大量的3D API的支持了,作为对OPENGL的一种补充,QT 3D使用起来更加方便,并且跨平台。但是Qt中关于QT 3D的文档并不是很全面。很多初学者包括我自己现在都是摸索着前进的。网上虽然也有教程,但是却都是让人云里雾里不知所以然的。不过以后会好很多的了,因为Qt即将发布qt3DStudio了,有了这个工具,咱们以后开发qt3D 的程序时就容易上手了。 首先我们需要找到Qt 3D的帮助文档,我们直接在QtCreator中搜索qt3d,然后就可以看到和3D相关的文档了。这里我们类比一下其他3D程序的开发工具,譬如Unity3D,采用C#语言开发,而QtStudio以后就应该是C++和QML开发了,所以大家如果没用过Unity3D,也可以去下载一个试试看,建立一个初步的认识。

然后我们还需要查看Qt3D的案例,这些案例里面有一些图片和材料文件,估计初学者都不知道是什么东西,如果我们要仿照案例去写自己的程序,又该如何入手呢?这里我们需要两个工具,一个是blender,Linux下最流行的3D建模软件,blender也可以在MAC和Windows 上使用,因为它是跨平台的。大家可以直接使用sudo apt-get install blender进行安装。 Blender软件是用来查看Qt 3D例子中资源文件中的obj材料文件的,如下图。我们可以使用blender打开这些obj文件,也可以自己动手做一些材料,然后导出为obj文件。导入导出见下图。

然后我们在上面还看到一种图片,这种图片格式很新颖,我还是第一次见,估计初学者很多也是第一次见吧。所以既然Qt用到了,咱们仿写程序的时候,没有这个图片可就不好办了。所以这里我们还要另一工具,cwebp,大家可以使用sudo apt-get install webp安装即可。Webp 格式的图片是谷歌开发的一种新型的比jpg,png等图片更适合在网络上进行传输的图片,将来估计会广泛使用的,这里我们就先跟着QT尝个鲜吧。

相关主题
文本预览
相关文档 最新文档