QWidget消息传递的一种方法
来源:互联网 发布:java前端和后端的意思 编辑:程序博客网 时间:2024/06/06 21:44
转自:http://www.cppblog.com/umbcom/archive/2008/12/30/70737.html
在使用QT之前,或许我是习惯了MFC的消息传递机制,所以觉得事件伴随着全部的触发信息是理所当然,但这显然让我又让我自己欺骗了自己。在MFC下,通过分析事件传递的wParam和lParam就可以很方便的得到事件的信息,但在QT信号和槽的机制下,如果是初学者的您可能会跟我一样感到无所适从。
大多使用过QT的人都知道,信号和槽的机制贯穿了整个QT的框架,虽说理解起来并不困难,但是在使用它的时候确是大有文章。例如,我们在单击了一个button时,我们想得到关于这个button的相关信息,比如button的text,icon,等等所有与这button相关的信息,下面我就举例说明一下我解决这问题的方法。您可能有更好的方法,如果您不介意的话,我希望您能奉献给大家,这其中当然包括我,或者给留下相关的链接地址,我十分高兴与您讨论。这种情况在MFC下通过映射之后利用wParam可能就能得到想要的结果,但是在QT中,好像表达的并没有那么明显。我就拿QPushButton来举例子,其他的类似。
在QT助手中提供的信息是这样的,QPushButton提供了6个信号,分别为继承自QAbstractButton所拥有的
void clicked ( bool checked = false) //按钮被鼠标点击时的信号
void pressed () //按钮被按下时的信号
void released () //按钮被释放时的信号
void toggled ( bool checked ) //按钮状态发生改变时的信号(一般也就指被按下或者被弹起)
QWidget所拥有的void customContextMenuRequested ( const QPoint & pos )和QObject所拥有的void destroyed ( QObject * obj = 0 ),这两个是QWidget本身所拥有的属性,这里就不做讨论了。
一看这四种信号只有两个传递了button的状态,而这两个状态也只是指示了按钮是否被按下的状态,但是我要得到按钮上的文字,这可怎么办呀?我是这么做的:
首先,我从QPushButton派生出一个自己的PushButton
//MyButton.h
#include <QtGui/QPushButton>
class MyButton : public QPushButton
{
Q_OBJECT
public:
MyButton(QWidget *parent = 0);
~MyButton();
signals:
void ReturnText(const QString &itemtext); //这里只能在头文件里面声明,cpp文件里不需定义
public slots:
void SendItemText(); //给自己的BUTTON多添加一个用于响应的槽
};
//MyButton.cpp
#include "MyButton.h"
MyButton::MyButton(QWidget *parent):QPushButton(parent)
{
//在我的button初始化的时候就连接好clicked的事件,并对应自己所要响应的槽
connect(this,SIGNAL(clicked()),this,SLOT(SendItemText()));
}
MyButton::~MyButton()
{
}
void MyButton::SendItemText()
{
//当鼠标点击我的button时,button会做出响应并把自己的text发送到ReturnText的这个事件上
emit ReturnText(this->text());
}
在之前RuturnText上,QT会自动将你所发射的信息关联到所对应的信号上,如果你试图自己去写ReturnText的实现函数,那么程序将在编译时报错。
接下来我们就可以使用我们需要的东西了,我们先创建一个对话框:
//MyDialog.h
#include <QtGui/QDialog>
class QVBoxLayout;
class QLabel;
class MyButton;
class MyDialog :public QDialog
{
Q_OBJECT
public:
MyDialog(QWidget *parent = 0);
~MyDialog(void);
public slots:
void LabelText(const QString &);
private:
QVBoxLayout *layout;
QLabel *label;
MyButton *btn;
};
//MyDialog.cpp
#include "MyDialog.h"
#include "MyButton.h"
#include <QtGui/QVBoxLayout>
#include <QtGui/QLabel>
MyDialog::MyDialog(QWidget *parent):QDialog(parent)
{
layout=new QVBoxLayout(this);
label=new QLabel;
btn=new MyButton(this);
btn->setText("text");
btn->setFixedSize(QSize(200,30));
label->setFixedSize(QSize(200,30));
layout->addWidget(label);
layout->addWidget(btn);
//在这里再与要显示的部件连接,这是就可以传递我们需要的信息了
connect(btn,SIGNAL(ReturnText(const QString &)),this,SLOT(LabelText(const QString &)));
}
MyDialog::~MyDialog(void)
{
delete btn;
btn=NULL;
delete label;
label=NULL;
delete layout;
layout=NULL;
}
void MyDialog::LabelText(const QString &btnText)
{
//将得到的信息显示出来
this->label->setText(btnText);
}
最后,main函数,这个没什么特别:
#include <QtGui/QApplication>
#include "MyDialog.h"
int main(int argc,char** argv)
{
QApplication app(argc,argv);
MyDialog dialog;
dialog.show();
return app.exec();
}
好了,这里只传递了text,它还能做很多工作,您自己试试吧,希望对您有用并祝一切顺利。
以上程序在本机编译运行通过。vc2008+QT4.4.2.
- QWidget消息传递的一种方法
- EGL中一种消息传递的解决方案
- c++中传递指针的一种方法
- AngularJS的一种参数传递方法
- 一种消息传递方式,很好
- 一种简单的消息和事件传递模型
- 一种弹出消息对话框的方法
- C 消息连接的一种系统方法
- MFC中传递消息的方法
- windows 传递文件到ubuntu的一种方法。
- 一种VB窗体之间简单的参数传递方法
- .Net中窗体间传递值的一种方法
- web项目中传递值的另外一种方法
- 一种解决启动进程传递参数过长的方法
- 给cuda核函数传递二维数组的一种方法
- 证明JS是值传递的一种简单方法
- 一种跨移动应用的消息推送方法和装置
- *QT QGraphicsScene、QGraphicsItem、QGraphicsProxyWidget、QWidget间的事件传递
- JIL Widget开发入门
- 2010年最具影响十大技术:移动互联网占一半
- 正则表达式 -- 测试工具 -- WEB版
- JSP中自定义标签属性配置说明
- Project Euler Problem 15
- QWidget消息传递的一种方法
- 欲为Java技术大牛所需的25个学习要点
- Windows下ORACLE的完全卸载
- java动态代理
- 嵌入式Linux操作系统学习规划 (转)
- C#控件命名规范
- 随时能让肝脏排毒的食物
- 当前域名根路径
- QT界面美化