QT SLOT called 1,2,3... times
QT SLOT called 1,2,3... times
我正在连接一个信号/插槽,但每次触发该选项时,该插槽都会被调用多次(1、2、3…),以下是我的类:
主窗口.h:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Dialog *dialog;
signals:
void s1(QString s);
private slots:
void on_actionTooo_triggered();
};
#endif // MAINWINDOW_H
mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionTooo_triggered()
{
dialog = new Dialog(this);
QString s = "hello";
qDebug() << "CONNECT: " << connect(this, SIGNAL(s1(QString)),
dialog, SLOT(s1(QString)), Qt::UniqueConnection);
emit s1(s);
dialog->show();
}
对话框.h:
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
public slots:
void s1(QString str);
private:
Ui::Dialog *ui;
};
dialog.cpp:
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::s1(QString str)
{
qDebug() << str << endl;
}
每次在主窗口中触发该选项时,我都会将信号(仅一次)连接到新对话框,但当我运行时,例如两次时,它会打印两个"你好"。如果我在连接信号之前放一个disconnect(this, 0, 0, 0);
,它就会工作。
即使对象被破坏,它也能保持连接,这对我来说似乎很奇怪。它将连接绑定到之前创建的同一对象。这是预期的行为吗?
每次调用on_actionTooo_triggered()
时都会创建一个新的Dialog
。此Dialog
不会在函数结束时删除。因此,对于下一次呼叫,信号MainWindow::s1(QString)
被发射到两个不同的Dialog
s,这导致qDebug
中的多个耦合。
void MainWindow::on_actionTooo_triggered()
{
dialog = new Dialog(this);
QString s = "hello";
qDebug() << "CONNECT: " << connect(this, SIGNAL(s1(QString)),
dialog, SLOT(s1(QString)), Qt::UniqueConnection);
emit s1(s);
dialog->show();
}
此代码每次触发时都会创建一个新对话框,并在新创建的对话框和MainWindow之间建立连接。虽然连接被指定为"唯一",但每次都会创建一个新的对话框,因此连接不是唯一的,因为对话框实例不同。
您的代码不会显示对话框正在被删除,即使关闭了它的窗口,实例仍保留在内存中,因此多个对象接收到相同的信号。
您的Dialog
在该代码中从未被销毁。当您在Dialog
的构造函数中将this
作为父级传递时,它甚至不会泄漏,这使得MainWindow
负责这个Dialog
内存。
因此,您永久性地创建了额外的Dialog
,该插槽将被触发,从而解释了为什么您看到输出的重复递增。
相关文章:
- Qt的slot(?)将冗余命名空间插入连接
- Qt单选按钮仅在实际选中按钮时调用SLOT()
- 谷歌模拟 - 怎么说"function must be called ONCE with a certain parameter but ok to be called many times with
- "Static polymorphism with Qt signal/slot: What is wrong?"
- 如何正确将times -pec转换为时空
- 当Qt-Slot位于通过std::async创建的线程上时,它不会被调用
- QT 请求"QObject::connect: No such slot BackEnd::RequestReceived"
- QObject::connect not connecting signal to slot
- 将参数传递给QT设计器构建的slot函数
- 如何将变量从main传递到signal和slot宏
- QSortFilterProxyModel and the slot setFilterFixedString
- 如何从QListView的SIGNAL/SLOT传递/检索参数
- 在哪里声明从Qt SIGNAL/SLOT返回的对象
- C++ - two times DrawText()
- Qt - "No such slot" ,虽然有
- C++ Seekp multiple times
- 在另一个类中指定SLOT
- 如何获取哪个QradioButton调用SLOT
- 函数指针作为SLOT参数
- QT SLOT called 1,2,3... times