1

あるクラスから別のクラスのスロットに信号を接続しようとしていますが、接続するとアプリケーションが起動時にクラッシュします。ここの他の投稿と、カスタムシグナルを接続することを逃れた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();
}

MainWindow.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;
}
4

2 に答える 2

0

ポインタが初期化された後に必ず接続してください

connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
           ^
        valid ptr

また、プライベート スロットは、通常のメンバー関数として呼び出された場合はプライベートですが、接続に対しては常にパブリックです。スロットの目的は通信であるため、スロットをパブリックとして定義し、必要なときに通常どおりプライベート関数を使用するのは、これがよりクリーンな設計だと思いますprivate slot。理にかなっていますが、ここではそうではないと思います)

于 2013-09-17T09:21:10.077 に答える
0

adminWindow接続時に有効なポインターを使用していることを確認する必要があります。

void MainWindow::on_ConfigureUsersBtn_clicked()
{
    if(adminWindow == NULL)
    {
        adminWindow = new AdministrativeWindow();
        connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
        adminWindow->show();
    }
于 2013-09-17T09:18:46.910 に答える