首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

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

2013-08-09 
Qt中A类发射信号,B类的槽无法收到的问题做了一个键盘类KeyBoard.实现点击按键发送信号class KeyBoard : pu

Qt中A类发射信号,B类的槽无法收到的问题
做了一个键盘类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未被调用,求教……Qt中A类发射信号,B类的槽无法收到的有关问题Qt中A类发射信号,B类的槽无法收到的有关问题
[解决办法]
  KeyBoard keyboard;局部对象,构造函数执行完了,  keyboard;就析构了吧
[解决办法]
KeyBoard keyboard是局部变量了,你这要把keyboard这次B的的类成员变量,让他的生命周期和B一样,才能b存在时正常接收到信号
[解决办法]

引用:
Quote: 引用:

  KeyBoard keyboard;局部对象,构造函数执行完了,  keyboard;就析构了吧

我把KeyBoard keyboard放到头文件里,也不能收到信号

放到头文件里了,如果还这么写,那是两个变量只不过名字一样。
[解决办法]
signals:
    void clickedKey(int keyNum);
不会是没有emit吧?当然不写emit,直接写信号也可以发射。
PS:在构造函数里,把代码都写到ui->setupUi(this);的后面,这样不容易出错。
------解决方案--------------------


没看到在什么地方发射信号,没发射信号能调起来slot?
[解决办法]
emit都没使用,请问如何执行slot。。。
重写KeyBoard的mousePress事件。 

[解决办法]
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~
[解决办法]
在改进之后的代码里面,Qt的信号函数也没有发射,自然是无法让slot接收到的。首先,你要写好KeyBoard这个类,你想要在什么地方发射信号,就在什么地方使用emit就可以了。
[解决办法]
再有就是,你的 KeyBoard 类和 B 类斗继承自QWidget,但是我不知道你是使用的哪个做主窗体,只要你的KeyBoard实例化之后,没有在界面上(被鼠标选中)作为活动窗体,你的键盘事件是无法让它接收到的,那么它也不会发射任何你想要借此映射出来的鼠标事件消息的。
[解决办法]

引用:
再有就是,你的 KeyBoard 类和 B 类斗继承自QWidget,但是我不知道你是使用的哪个做主窗体,只要你的KeyBoard实例化之后,没有在界面上(被鼠标选中)作为活动窗体,你的键盘事件是无法让它接收到的,那么它也不会发射任何你想要借此映射出来的鼠标事件消息的。

这个是个问题,我晚上研究下。

热点排行