如何在Qt中写两个类,它们可以相互发信号与接收信号。

天地一扁舟 2012-07-24 01:57:38
希望朋友们能指点一下
...全文
5034 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ_278397935 2014-11-18
  • 打赏
  • 举报
回复
这个问题也是困扰我呀
中才德创 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
从QObject集成即可
如果之前建立这两个类的时候没有从QObject集成的话,就手动在代码上添加上,并且加上Q_OBJECT宏
然后在从新qmake一次工程即可
[/Quote]不然的话,Q_OBJECT加过之后,报警:
debug/editpainter.o: In function `editPainter':
C:\Users\c81003885\Documents\photoEditor/editpainter.cpp:7: undefined reference to `vtable for editPainter'
C:\Users\c81003885\Documents\photoEditor/editpainter.cpp:7: undefined reference to `vtable for editPainter'
C:\Users\c81003885\Documents\photoEditor/editpainter.cpp:7: undefined reference to `vtable for editPainter'
C:\Users\c81003885\Documents\photoEditor/editpainter.cpp:7: undefined reference to `vtable for editPainter'
collect2: ld returned 1 exit status
奔跑哥 2012-08-02
  • 打赏
  • 举报
回复
这算是问题吗,去看Qt的基本signal slot机制去。
CanDy_O 2012-07-28
  • 打赏
  • 举报
回复
A.h


#ifndef A_H
#define A_H

#include <QObject>
#include <QDebug>
class A : public QObject
{
Q_OBJECT
public:
explicit A(QObject *parent = 0) :
QObject(parent)
{
}
void sendSignalToB()
{
emit toB();
}
signals:
void toB();
public slots:
void fromB()
{
qDebug() << "i am A ,Rcv from B.";
}
};

#endif // A_H



B.h

#ifndef B_H
#define B_H

#include <QObject>
#include <QDebug>
class B : public QObject
{
Q_OBJECT
public:
explicit B(QObject *parent = 0) :
QObject(parent)
{
}
void sendSignalToA()
{
emit toA();
}
signals:
void toA();
public slots:
void fromA()
{
qDebug() << "i am B ,Rcv from A.";
}

};

#endif // B_H



main.cpp


#include <QtCore/QCoreApplication>
#include "a.h"
#include "b.h"
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);

A *a = new A;
B *b = new B;
app.connect(a, SIGNAL(toB()), b, SLOT(fromA()));
app.connect(b, SIGNAL(toA()), a, SLOT(fromB()));

a->sendSignalToB();
b->sendSignalToA();

return app.exec();
}

haltwang 2012-07-27
  • 打赏
  • 举报
回复
类A中:
.h
signals:
void signalInA(int);
private slots:
void slotInA(QString);
.cpp
你想要发信号的地方
emit signalInA(123);
void A::slotInA(QString s)
{
尽情的使用s;
}

类B中:
.h
signals:
void signalInB(QString);
private slots:
void slotInB(int);
.cpp
你想要发信号的地方
emit signalInB("hello");
void B::slotInB(int num)
{
尽情的使用num;
}

最后使用connect将信号槽联系起来
刀刀亮 2012-07-27
  • 打赏
  • 举报
回复
1.信号槽什么情况下可用,我想就不用和楼主解释了,但是有一点楼至要知道,那就是信号槽在连接的时候必须确定已经创建出实例了。也就是必须分配完了内存才能进行信号槽的链接,不然会出问题的,楼主不信的话可以试一试。
2.楼主想写两个类仅仅依靠这两个类进行信号槽的链接,而不采用第三个类进行产生实例,而后在进行信号槽的链接,所以3L的方法是不可行的。
3.所以楼主可以考虑这样子做。方案一:定义类A,定义类B,其中类A有一个重载的构造函数,这个构造函数可以接受一个类B的指针或者副本,而后在类A的这个构造函数里面,楼主就可劲的链接吧。。。。更或者把这个构造函数抽象成一个对外的接口,相连就连,想断就断。方案二:。。。打字太累了……不写了……
SilenceSu 2012-07-27
  • 打赏
  • 举报
回复
+1[Quote=引用 1 楼 的回复:]

想要用signal和slot的功能,那你写的类就必须继承QObject。
1.qtcreator->ctrl+N->c++ class->Bass class选择QObject。
2.在新建类的头文件中添加signal和slot即可。
[/Quote]
翠屏阿姨 2012-07-27
  • 打赏
  • 举报
回复
在创建这两个类实例的类里面,执行这样的操作connect(类1,SIGNAL(),类2,SLOT());connect(类2,SIGNAL(),类1,SLOT());嘿嘿
就这样好了 2012-07-25
  • 打赏
  • 举报
回复
从QObject集成即可
如果之前建立这两个类的时候没有从QObject集成的话,就手动在代码上添加上,并且加上Q_OBJECT宏
然后在从新qmake一次工程即可
dinjay 2012-07-24
  • 打赏
  • 举报
回复
想要用signal和slot的功能,那你写的类就必须继承QObject。
1.qtcreator->ctrl+N->c++ class->Bass class选择QObject。
2.在新建类的头文件中添加signal和slot即可。

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧