【问题标题】:Qt5 Connect Custom WindowClose Signal To A Different WindowQt5 将自定义 WindowClose 信号连接到不同的窗口
【发布时间】:2013-09-21 15:37:30
【问题描述】:

我正在尝试将一个类的信号连接到另一个类的插槽,但是当我这样做时,我的应用程序在启动时崩溃了。我在这里阅读了一些其他帖子和 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;
}

【问题讨论】:

  • 不需要私有槽,所有槽都是公共的
  • adminWindowClose 定义在哪里?
  • 指针初始化后进行连接

标签: c++ signals connect qt5 slots


【解决方案1】:

您需要确保您在连接时使用了有效的adminWindow 指针:

void MainWindow::on_ConfigureUsersBtn_clicked()
{
    if(adminWindow == NULL)
    {
        adminWindow = new AdministrativeWindow();
        connect(adminWindow, SIGNAL(windowClose()), this, SLOT(adminWindowClose()));
        adminWindow->show();
    }

【讨论】:

  • 啊,现在我将连接移动到 on_ConfigureUsersBtn_clicked() 后出现此错误:QWeakPointer 中的 ASSERT 失败:“检测到 QWeakPointer 在被删除的 QObject 中创建”,文件 tools\qsharedpointer.cpp,第 1230 行传递给 C 运行时函数的参数无效。传递给 C 运行时函数的参数无效。
  • 我应该补充一点,在我现在在管理窗口中触发关闭之前不会发生这种情况,这是比以前更好的结果,因为这意味着连接它(部分)工作不会是吗?
  • 别担心,修复它。谢谢你的帮助:)
【解决方案2】:

一定要在指针初始化后进行连接

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

如果作为常规成员函数调用,私有插槽也是私有的,但对于连接始终是公共的。我认为这是一种更简洁的设计,将插槽定义为公共,因为它们的目的是通信,并在需要时照常使用私有功能,除非你真的需要像 private slot 这样的混合概念(它可能存在,但可以想象一些特殊情况这可能有道理,我认为这里不是这种情况)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多