我正在尝试用自定义信号连接两个框架,但是我并没有真正得到它。
这段代码只是我在程序中尝试执行的示例,我的目标是在帧之间传输数据。
文件:
(发送者)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
signals:
void send();
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
在“ mainwindow.cpp”上,我有一个无效的on_pushButton_clicked(),它发出信号并显示新帧:
私人广告位无效:
void MainWindow::on_pushButton_clicked()
{
emit send();
Dialog sw;
sw.setModal(true);
sw.exec();
}
(接收方):
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void receive();
private:
Ui::Dialog *ui;
int a;
};
#endif // DIALOG_H
和.cpp:
#include "dialog.h"
#include "ui_dialog.h"
#include "mainwindow.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
a=0;
MainWindow w;
connect(&w, SIGNAL(send()), this, SLOT(receive()));
qDebug() << a;
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::receive(){
qDebug() << "ola";
a++;
}
结论: 因此基本上,函数Dialog不会打印qDebug(),并且'a'仍为0,因此我得出结论,未设置/执行连接。
谢谢, 最好的祝福, 迪伦·洛佩斯。
编辑:在帖子末尾写上结论。
答案 0 :(得分:0)
信号和插槽之间的连接并不意味着将触发信号功能。
您仍然需要发出信号,以使a
得到更新。
创建一个空插槽也不起作用,因为插槽是信号的接收点。在这种情况下,on_pushButton_clicked()
会在单击按钮时触发。除非您调用send
(IIRC,您通过EMIT发出信号,是否会这样,否则不会触发EMIT(send())
。
答案 1 :(得分:0)
考虑您的Dialog
构造函数中的代码...
MainWindow w;
connect(&w, SIGNAL(send()), this, SLOT(receive()));
这将在堆栈上创建本地作用域的MainWindow
,并将其send()
信号连接到Dialog
的{{1}}插槽。但是receive()
构造函数完成后,MainWindow
(以及因此的连接)将被销毁。
此外,查看Dialog
...
MainWindow::on_pushButton_clicked
在构造void MainWindow::on_pushButton_clicked()
{
emit send();
Dialog sw;
sw.setModal(true);
sw.exec();
}
之前,您会发出send()
信号 。
对于您要提供确切答案的目的,我确实不太了解,但是为了获得某种信号/插槽交互作用,您可能需要执行以下操作:更改{{1 }}的构造函数...
Dialog
然后将Dialog
更改为...
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
a=0;
qDebug() << a;
}
这至少应导致调用MainWindow::on_pushButton_clicked
,并且您可以从那里开始工作。