我正在尝试将一个类的信号连接到另一个类中的插槽,但是当我这样做时,我的应用程序在启动时崩溃。我在这里和 Qt 论坛上阅读了一些其他帖子,这些帖子没有连接自定义信号,但我认为我连接它们是错误的。任何帮助是极大的赞赏。
管理窗口.h
class AdministrativeWindow : public QMainWindow
{
Q_OBJECT
public:
explicit AdministrativeWindow(QWidget *parent = 0);
~AdministrativeWindow();
private slots:
void on_actionExit_Administrative_Window_triggered();
private:
Ui::AdministrativeWindow *ui;
signals:
void windowClose();
};
管理窗口.cpp
void AdministrativeWindow::on_actionExit_Administrative_Window_triggered()
{
emit windowClose();
close();
}
主窗口.cpp
connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
void MainWindow::on_ConfigureUsersBtn_clicked()
{
if(adminWindow == NULL)
{
adminWindow = new AdministrativeWindow();
adminWindow->show();
}
else if(adminWindow->isVisible())
{
adminWindow->activateWindow();
adminWindow->showNormal();
}
else
{
adminWindow->show();
}
}
void MainWindow::on_adminWindowClose()
{
delete adminWindow;
adminWindow = NULL;
}
您需要确保在连接时使用有效的
adminWindow
指针:
void MainWindow::on_ConfigureUsersBtn_clicked()
{
if(adminWindow == NULL)
{
adminWindow = new AdministrativeWindow();
connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
adminWindow->show();
}
请务必在指针初始化后进行连接
connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
^
valid ptr
如果作为常规成员函数调用,私有插槽也是私有的,但对于连接始终是公共的。我认为这是将插槽定义为公共的更清晰的设计,因为它们的目的是通信,并在需要时照常使用私有函数,除非您确实需要像
private slot
这样的混合概念(但是它可能存在,人们可以想象一些特殊情况这可能有道理,我认为这里的情况并非如此)