单击按钮时,QT消息框不会弹出

时间:2017-04-19 17:24:14

标签: c++ qt qt5

我刚刚开始学习QT,我想要完成的是点击按钮上的弹出消息。 以下是我的文件的样子:

的main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include <QMessageBox>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QWidget>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow *mainWindow = new MainWindow();


    QLabel *text = new QLabel("Some text");
    QPushButton *btn = new QPushButton("Click");

    QHBoxLayout *layout = new QHBoxLayout;

    layout->addWidget(btn);
    layout->addWidget(text);

    QObject::connect(btn, SIGNAL(clicked()), &app, SLOT(popup()));

    mainWindow->setLayout(layout);
    mainWindow->show();

    return app.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::popUp()
{
    QMessageBox::information(this, "New Box", "Message");
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:
    void popUp();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

你能解释一下我做错了什么,或者我的代码中可能缺少什么。

4 个答案:

答案 0 :(得分:2)

我建议图形部分在类GetHashCode中实现它,因为私有的成员MainWindow处理设计。

ui

不要对#include <QMessageBox> #include <QLabel> #include <QLayout> #include <QPushButton> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QLabel *text = new QLabel("Some text"); QPushButton *btn = new QPushButton("Click"); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(btn); layout->addWidget(text); ui->centralWidget->setLayout(layout); connect(btn, &QPushButton::clicked, this, &MainWindow::popUp); } 进行任何更改,代码应如下所示:

main.cpp

答案 1 :(得分:0)

连接错误。您应该将clicked()信号连接到mainWindow的广告位popUp(),因为它是MainWindow类的成员。并且不要忘记c ++的区分大小写(pop Up ,而不是弹出窗口):

QObject::connect(btn, SIGNAL(clicked()), mainWindow, SLOT(popUp()));

答案 2 :(得分:0)

您正在从主窗口外部连接到私人广告位。 应用程序输出可能会向您显示如下警告:

  

QObject :: connect:没有这样的插槽QApplication :: popup()

通常你要做的就是把主窗口内的东西放在mainwindow类中。

例如:在构造函数内创建布局 您可以在创建对象时使用parent参数,以便在使用mainwindow完成时将其销毁。

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

    QLabel *text = new QLabel("Some text", this);
    QPushButton *btn = new QPushButton("Click", this);

    QHBoxLayout *layout = new QHBoxLayout;

    QObject::connect(btn, SIGNAL(clicked()), this, SLOT(popUp()));

    ui->centralWidget->setLayout(layout);
    this->show();
}

您必须使用ui->centralWidget,因为这是主窗口的工作原理。应用程序输出也应该给你一个警告。 像这样:

  

QWidget :: setLayout:试图设置QLayout&#34;&#34;在MainWindow&#34; MainWindow&#34;,已经有一个布局

答案 3 :(得分:0)

好的,你必须处理文件mainwindow.cpp。你已经创建了插槽,所以连接它在MainWindow的构造函数中添加这个代码(如果你不知道女巫是mw构造函数,那么它是写成ui->setupUi(this);的函数)

connect(ui->btn, SIGNAL(clicked()), SLOT(popUp()));

现在在插槽MainWindow::popUp();中输入此代码:

QMessageBox msgBox;
msgBox.setText("text to write");
msgBox.exec();

记得在mainwindow.cpp 中加入QMessageBox ,你不应该在main.cpp上编写代码,必须是这样的:

#include "mainwindow.h"
#include <QApplication>

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();

        return a.exec();
    }