QT连接到按钮不起作用

时间:2017-04-23 03:33:20

标签: c++ qt

我在QT尝试了一个非常简单的程序。我在QT设计器中用一个按钮创建了一个对话框。我想要程序,当我点击按钮时,我会得到消息框。我调试了程序。但是,单击按钮后,信号将不会运行OnClickedPushButton(bool)。哪里出错? 我的代码看起来像:

#include "qttest.h"
#include <QtGui>
#include <QMessageBox>

QTTest::QTTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(OnClickedPushButton()));

    QPushButton *button = new QPushButton(this);
    button->setText("ClcikMe");
    button->setGeometry(QRect(QPoint(150, 50), QSize(85, 25)));
    connect(button, SIGNAL(clicked()), this, SLOT(OnClickedPushButton()));
}

QTTest::~QTTest()
{

}

void QTTest::OnClickedPushButton()
{
    QMessageBox::about(this, "Message", "You pushed button.");
}

我可以构建它,我可以启动它。但是,调试器在构造函数中写下了以下消息:

QObject::connect: No such slot QTTest::OnClickedPushButton() in qttest.cpp:9
QObject::connect:  (sender name:   'pushButton')
QObject::connect:  (receiver name: 'QTTestClass')
QObject::connect: No such slot QTTest::OnClickedPushButton() in qttest.cpp:14
QObject::connect:  (receiver name: 'QTTestClass')

我可以在窗口看到两个按钮。 pushButton和按钮。但是,如果我点击按钮,则由于错误的插槽映射而不会出现消息。你知道如何正确地做到这一点吗?

4 个答案:

答案 0 :(得分:2)

这里有两种可能性: 如果Avi提到,您可以将OnClickedPushButton声明为广告位,也可以使用new signal/slot connection syntax。使用新语法,您可以将信号连接到任意函数,如下所示:

connect(pushButton, &QPushButton::clicked, this, &QTTest::OnClickedPushButton);

这比旧语法的主要优点是它在编译时被检查,并且你不能像你现在获得的运行时错误那样结束。

答案 1 :(得分:1)

您需要在头文件中将'OnClickedPushButton'声明为SLOT。 编译器无法在代码中的插槽列表中找到指定的函数。

答案 2 :(得分:0)

如果您在创建项目时已经创建了一个主窗口,那么您不必手动创建按钮。您可以使用设计器打开MainWindow,拖放按钮,然后右键单击按钮,选择&#34;转到插槽&#34;选项,这将打开源代码。样本来源在这里,

#include "qttest.h"
#include "ui_qttest.h"
#include <QMessageBox>

QTTest::QTTest(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::QTTest)
{
    ui->setupUi(this);
}

QTTest::~QTTest()
{
    delete ui;
}

void QTTest::on_pushButton_clicked()
{
    QMessageBox::about(this, "Message", "You pushed button.");
}

另请粘贴您的标题代码。

答案 3 :(得分:-2)

尝试此connect(ui.pushButton, SIGNAL(release()), this, SLOT(OnClickedPushButton(bool)));或者您可以使用SIGNAL(clicked())而不使用bool。我没有测试它,但似乎对你有用。