Qt5 将自定义窗口关闭信号连接到其他窗口

Qt5 Connect Custom WindowClose Signal To A Different Window

本文关键字:窗口 连接 其他 信号 自定义 Qt5      更新时间:2023-10-16

我正在尝试将一个类的信号连接到另一个类中的插槽,但是当我这样做时,我的应用程序在启动时崩溃。我在这里和Qt论坛上阅读了其他一些帖子,这些帖子未能连接自定义信号,但我认为我连接它们错了。任何帮助将不胜感激。

AdministrativeWindow.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这样的混合概念(但是它可能存在,并且可以想象一些特殊情况,这可能有意义,我认为这里不是这种情况)