emit 发出的信号,槽函数无响应。

M_Pinery 2020-11-13 11:04:13
初学者,想实现在子窗口中,点击close的按键,signal类emit 出 mysignal()信号,打印“emit success”,然后Widget::kong的槽函数接收到,打印“slot kong accept success”。
但是目前的情况是,Widget::kong的槽函数无响应。只有“emit success”打印出来,求大神帮忙看看是怎么回事,十分感谢!


工程文件如下图




signal.h文件如下
#ifndef SIGNAL_H
#define SIGNAL_H

#include <QWidget>
#include <QPushButton>

namespace Ui {
class Signal;
}

class Signal : public QWidget
{
Q_OBJECT

public:
explicit Signal(QWidget *parent = 0);
~Signal();


signals:
void Mysignal();

public slots:
void on_pushButton_clicked();

private:
Ui::Signal *ui;

};

#endif // SIGNAL_H


widget.h文件如下:
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include "signal.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

[code=c]public:
explicit Widget(QWidget *parent = 0);
~Widget();


public slots:
void kong();



private:
Ui::Widget *ui;
Signal s;
};

#endif // WIDGET_H


main.cpp文件如下:
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
Signal s;
s.show();


return a.exec();
}


signal.cpp文件如下:
#include "signal.h"
#include "ui_signal.h"
#include <QDebug>

Signal::Signal(QWidget *parent) :
QWidget(parent),
ui(new Ui::Signal)
{
ui->setupUi(this);
}

Signal::~Signal()
{
delete ui;
}

void Signal::on_pushButton_clicked()
{
emit Mysignal();
qDebug() << "emit success";
}


widget.cpp文件如下:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);


connect(&s,SIGNAL(Mysignal()),this,SLOT(kong()));


}

Widget::~Widget()
{
delete ui;
}

void Widget::kong()
{
qDebug() << "slot kong accept success";
}


最后的运行结果:


点击close按钮,只有emit success 打印出来。


(做了实验:将main.cpp,中的
Signal s;
s.show();
改为在signal.cpp中this->show(),则kong的槽函数正常响应。但是,因为还是需要在其他的类函数中实现
Signal s;
s.show();
kong函数还是无响应,各位大神帮忙看看是怎么回事,十分感谢!
...全文
8950 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
弓人水 2020-11-16
  • 打赏
  • 举报
回复
引用 5 楼 M_Pinery 的回复:
[quote=引用 1 楼 弓人水 的回复:]首先,有两个Signal对象,一个main函数里,一个Widget的成员;
你点击的是main里面的Signal对象show的界面,绑定的是Widget里面的Signal成员和槽函数,怎么会触发槽函数呢?


您好,再问下我怎么要在比如另一个类中,比如叫 keyboard,怎么去show上面说的Widget对象中的界面?十分感谢[/quote]
1、可以把Widget的对象传入keyboard,作为keyboard的成员,就可以了;
2、或者让Widget作为一个全局的静态对象,也可以。
M_Pinery 2020-11-16
  • 打赏
  • 举报
回复
引用 1 楼 弓人水 的回复:
首先,有两个Signal对象,一个main函数里,一个Widget的成员; 你点击的是main里面的Signal对象show的界面,绑定的是Widget里面的Signal成员和槽函数,怎么会触发槽函数呢?
您好,再问下我怎么要在比如另一个类中,比如叫 keyboard,怎么去show上面说的Widget对象中的界面?十分感谢
  • 打赏
  • 举报
回复
上面的不行,楼上说的对
  • 打赏
  • 举报
回复
你把两个定义挪上去即可
Signal s;
Widget w;
w.show();

s.show();
弓人水 2020-11-14
  • 打赏
  • 举报
回复
首先,有两个Signal对象,一个main函数里,一个Widget的成员;
你点击的是main里面的Signal对象show的界面,绑定的是Widget里面的Signal成员和槽函数,怎么会触发槽函数呢?
hitzsf 2020-11-14
  • 打赏
  • 举报
回复
楼上说的对,在main函数里关联w和s的信号槽

21,462

社区成员

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

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