Qt按钮无法连接插槽

Qt Pushbutton can not connect slot

我用QT Designer 创建了一个简单的对话框,并在上面放了一个pushbutton。然后我在 pressed() 信号上添加了一个名为 test_button() 的自定义插槽。我看到生成的代码,可以看到有一个 setupUI 函数,其中包含以下内容:

QObject::connect(pushButton, SIGNAL(clicked()), TestUIClass, SLOT(test_button()));

我有一个 testui.cpp 和一个 testui.h:

#include <QtWidgets/QMainWindow>
#include "ui_testui.h"

class TestUI : public QMainWindow
{
    Q_OBJECT

public:
    TestUI(QWidget *parent = 0);
    ~TestUI();

    virtual void test_button();

private:
    Ui::TestUIClass ui;
};

这是testui.cpp

#include "testui.h"
#include <QMessageBox>

TestUI::TestUI(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

TestUI::~TestUI()
{

}

void TestUI::test_button()
{
    QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.setInformativeText("Do you want to save your changes?");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);
    int ret = msgBox.exec();
}

我的理解是这就是我必须做的全部,但我无法让消息框出现。

/********************************************************************************
** Form generated from reading UI file 'testui.ui'
**
** Created by: Qt User Interface Compiler version 5.9.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_TESTUI_H
#define UI_TESTUI_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_TestUIClass
{
public:
    QWidget *centralWidget;
    QPushButton *pushButton;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *TestUIClass)
    {
        if (TestUIClass->objectName().isEmpty())
            TestUIClass->setObjectName(QStringLiteral("TestUIClass"));
        TestUIClass->resize(600, 400);
        centralWidget = new QWidget(TestUIClass);
        centralWidget->setObjectName(QStringLiteral("centralWidget"));
        pushButton = new QPushButton(centralWidget);
        pushButton->setObjectName(QStringLiteral("pushButton"));
        pushButton->setGeometry(QRect(120, 70, 187, 57));
        TestUIClass->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(TestUIClass);
        menuBar->setObjectName(QStringLiteral("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 600, 47));
        TestClass->setMenuBar(menuBar);
        mainToolBar = new QToolBar(TestUIClass);
        mainToolBar->setObjectName(QStringLiteral("mainToolBar"));
        TestUIClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(EyeGazeUIClass);
        statusBar->setObjectName(QStringLiteral("statusBar"));
        TestUIClass->setStatusBar(statusBar);

        retranslateUi(TestUIClass);
        QObject::connect(pushButton, SIGNAL(clicked()), TestUIClass, SLOT(test_button()));

        QMetaObject::connectSlotsByName(TestUIClass);
    } // setupUi

    void retranslateUi(QMainWindow *TestUIClass)
    {
        TestUIClass->setWindowTitle(QApplication::translate("TestUIClass", "TestUI", Q_NULLPTR));
        pushButton->setText(QApplication::translate("TestUIClass", "PushButton", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class TestUIClass: public Ui_TestUIClass {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_TestUI_H

首先,您需要告诉 Qt 您的插槽实际上 个插槽:

public slots:  // or protected/private
    void test_button();

不需要虚拟插槽...

其次,'clicked' 信号的插槽应接受布尔参数:

void test_button(bool);

不过,对于普通按钮,您可以忽略该值。

最后,但这只是一个提示:Qt 在版本 5 中引入了一个新的 syntax 用于连接 signals/slots:

QObject::connect(pushButton, &QPushButton::clicked, theUI, &TestUIClass::test_button);

我比较喜欢,不过要看你用哪个了...