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无法连接插槽的主要内容,如果未能解决你的问题,请参考以下文章