Qt中A类发射信号,B类的槽无法收到的问题

Bower 2013-08-03 03:51:19
做了一个键盘类KeyBoard.实现点击按键发送信号
class KeyBoard : public QWidget
{
Q_OBJECT

signals:
void clickedKey(int keyNum);
}
在类B中实例化KeyBoard,并连接KeyBoard的信号和B类的槽函数
class B : public QWidget
{
Q_OBJECT

public slots:

void slotGetKeyNum(int num);
};
B::B(QWidget *parent) : QWidget(parent), ui(new Ui::B)
{
KeyBoard keyboard;
connect(&keyboard,SIGNAL(clickedKey(int)),this,SLOT(slotGetKeyNum(int)));
ui->setupUi(this);
}
void B::slotGetKeyNum(int num)
{
int keynum;
keynum = num;
}
然后在main函数中实例化类B

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
B b;
b.show();
return a.exec();
};
断点调试,点击按键发射信号后函数slotGetKeyNum未被调用,求教……
...全文
1168 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mypint_skyman 2016-03-28
  • 打赏
  • 举报
回复
我也碰到了同一问题,怎么都收不到啊
Camel 2013-08-16
  • 打赏
  • 举报
回复
楼主,我也遇到了同样的问题,能帮我看看吗?603361157
Bower 2013-08-06
  • 打赏
  • 举报
回复
问题已解决,我封装的键盘控件,在界面上就使用后就已经实例化了。之前做VC的,对Qt这种控件实例没弄清楚。
RubOne 2013-08-05
  • 打赏
  • 举报
回复
再有就是,你的 KeyBoard 类和 B 类斗继承自QWidget,但是我不知道你是使用的哪个做主窗体,只要你的KeyBoard实例化之后,没有在界面上(被鼠标选中)作为活动窗体,你的键盘事件是无法让它接收到的,那么它也不会发射任何你想要借此映射出来的鼠标事件消息的。
RubOne 2013-08-05
  • 打赏
  • 举报
回复
在改进之后的代码里面,Qt的信号函数也没有发射,自然是无法让slot接收到的。首先,你要写好KeyBoard这个类,你想要在什么地方发射信号,就在什么地方使用emit就可以了。
  • 打赏
  • 举报
回复
B::B(QWidget *parent) : QWidget(parent), ui(new Ui::B) { KeyBoard keyboard; connect(&keyboard,SIGNAL(clickedKey(int)),this,SLOT(slotGetKeyNum(int))); ui->setupUi(this); } keyborad 分配在栈上。。构造函数执行完, 这个对象就销毁了。。链接就无效了。。 解决办法, 分配在堆上。new~
左眼看到鬼 2013-08-05
  • 打赏
  • 举报
回复
引用 13 楼 RubOne 的回复:
再有就是,你的 KeyBoard 类和 B 类斗继承自QWidget,但是我不知道你是使用的哪个做主窗体,只要你的KeyBoard实例化之后,没有在界面上(被鼠标选中)作为活动窗体,你的键盘事件是无法让它接收到的,那么它也不会发射任何你想要借此映射出来的鼠标事件消息的。
这个是个问题,我晚上研究下。
一去丶二三里 2013-08-04
  • 打赏
  • 举报
回复
emit都没使用,请问如何执行slot。。。 重写KeyBoard的mousePress事件。
enkeichi 2013-08-04
  • 打赏
  • 举报
回复
没看到在什么地方发射信号,没发射信号能调起来slot?
jdwx 2013-08-03
  • 打赏
  • 举报
回复
signals: void clickedKey(int keyNum); 不会是没有emit吧?当然不写emit,直接写信号也可以发射。 PS:在构造函数里,把代码都写到ui->setupUi(this);的后面,这样不容易出错。
Bower 2013-08-03
  • 打赏
  • 举报
回复
引用 6 楼 jdwx1 的回复:
[quote=引用 5 楼 mpw040110 的回复:] [quote=引用 1 楼 hai200501019 的回复:] KeyBoard keyboard;局部对象,构造函数执行完了, keyboard;就析构了吧
我把KeyBoard keyboard放到头文件里,也不能收到信号[/quote] 放到头文件里了,如果还这么写,那是两个变量只不过名字一样。[/quote] 好吧,我这样写的,还是不能通信: class KeyBoard : public QWidget { Q_OBJECT signals: void clickedKey(int keyNum); } 在类B中实例化KeyBoard,并连接KeyBoard的信号和B类的槽函数 class B : public QWidget { Q_OBJECT private: KeyBoard *keyboard; public slots: void slotGetKeyNum(int num); }; B::B(QWidget *parent) : QWidget(parent), ui(new Ui::B) { keyboard = new KeyBoard; connect(keyboard,SIGNAL(clickedKey(int)),this,SLOT(slotGetKeyNum(int))); ui->setupUi(this); } void B::slotGetKeyNum(int num) { int keynum; keynum = num; } 然后在main函数中实例化类B int main(int argc, char *argv[]) { QApplication a(argc, argv); B b; b.show(); return a.exec(); };
jdwx 2013-08-03
  • 打赏
  • 举报
回复
引用 5 楼 mpw040110 的回复:
[quote=引用 1 楼 hai200501019 的回复:] KeyBoard keyboard;局部对象,构造函数执行完了, keyboard;就析构了吧
我把KeyBoard keyboard放到头文件里,也不能收到信号[/quote] 放到头文件里了,如果还这么写,那是两个变量只不过名字一样。
Bower 2013-08-03
  • 打赏
  • 举报
回复
引用 1 楼 hai200501019 的回复:
KeyBoard keyboard;局部对象,构造函数执行完了, keyboard;就析构了吧
我把KeyBoard keyboard放到头文件里,也不能收到信号
Bower 2013-08-03
  • 打赏
  • 举报
回复
引用 1 楼 hai200501019 的回复:
KeyBoard keyboard;局部对象,构造函数执行完了, keyboard;就析构了吧
我把KeyBoard keyboard放到头文件里,也不能收到信号
Bower 2013-08-03
  • 打赏
  • 举报
回复
我把KeyBoard keyboard放到头文件里,也不能收到信号
  • 打赏
  • 举报
回复
KeyBoard keyboard是局部变量了,你这要把keyboard这次B的的类成员变量,让他的生命周期和B一样,才能b存在时正常接收到信号
海的神话 2013-08-03
  • 打赏
  • 举报
回复
KeyBoard keyboard;局部对象,构造函数执行完了, keyboard;就析构了吧

16,240

社区成员

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

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