Qt Pushbutton无法连接插槽

Posted

技术标签:

【中文标题】Qt Pushbutton无法连接插槽【英文标题】:Qt Pushbutton can not connect slot 【发布时间】:2018-03-16 16:33:58 【问题描述】:

我使用 QT 设计器创建了一个简单的对话框,并在上面放置了一个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

【问题讨论】:

TestUIClass 是什么?那是你班级的对象吗?当您运行时,您是否在输出中看到失败的连接消息?您是否考虑过使用在编译时而不是运行时检测不匹配的 Qt5 连接语法? TestUIClass 是自动生成的,我可以编辑我的回复并添加它,请稍等 正确,在 TestUI 类的构造函数中作为 this 传入 【参考方案1】:

首先,你需要告诉 Qt 你的槽实际上是槽:

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

没有必要让插槽虚拟...

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

void test_button(bool);

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

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

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

我更喜欢它,但取决于你使用哪一个......

【讨论】:

我不认为你的第二点是完全正确的。信号和槽的签名必须兼容,但是槽的签名中可以有更少的参数,它会忽略多余的(比如 bool 在这种情况下) 不管怎样,使用较新的语法会使他的代码的所有问题通过编译器错误变得更加明显 谢谢!那行得通!使用 QT 设计器,点击并点击(布尔),一旦我添加了该功能,然后添加了公共插槽:它解决了我的问题!再次感谢您

以上是关于Qt Pushbutton无法连接插槽的主要内容,如果未能解决你的问题,请参考以下文章

Qt Connect 无法连接到插槽

信号和插槽的连接(关于 qlistview) - Qt

Qt PushButton 显示图像

Qt4 插槽和信号:Qt4 无法找到信号

如何将信号和插槽与 qt 中的另一个对象连接 - 已解决

Qt - 编译器无法识别“连接”