2017-04-19 2 views
2

私はちょうどQTを学び始めました。達成したいのは、ボタンをクリックするとポップアップメッセージが表示されます。ここ は私のファイルがどのように見えるかです:QTメッセージボックスがボタンクリックでpopusにならない

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 

私は間違ったことを説明してもらえますか、おそらく、私のコードに何かがありません。

答えて

2

MainWindowのグラフィックパーツでは、プライベートなメンバーuiがデザインを処理するため、このグラフィックパーツにはクラスMainWindowを実装することをお勧めします。

#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を変更しないでください、コードは次のようになります。

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



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

    w.show(); 

    return a.exec(); 
} 
+0

centralWidgetは何ですか? mainwindow.cpp:19:error:不完全な型 'class QLayout'の無効な使用 ui-> centralWidget-> layout() - > addWidget(btn);このウィジェットでエラーが発生しました。 ^ – Viktor

+0

テストが返されました。私の回答を更新してください。 – eyllanesc

+0

@ありがとうございました!なぜこの行でconnect(btn、&QPushButton :: clicked、this、&MainWindow :: popUp)を説明してください。 connect(btn、SIGNAL(clicked())、this、SLOT(popUp()))の代わりに&QPushButton :: clickedと&MainWindow :: popUpを使用する必要があります。 – Viktor

0

間違った接続。 MainWindowクラスのメンバーであるため、clicked()信号をmainWindowのスロットpopUp()に接続する必要があります。そして、Cの大文字と小文字の区別を忘れないでください++(ポップアップではない、アップ POP):あなたが外メインウィンドウから非公開スロットに接続している

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

[新しい信号スロット構文](HTTPSを使用している場合、大文字と小文字の区別の問題は問題ではないでしょう。 //wiki.qt.io/New_Signal_Slot_Syntax)コンパイラエラーがスローされたためです。 – MrEricSir

+0

@Vladimir Bershov私は変更を加えましたが、まだ動作していません – Viktor

0

。 アプリケーションの出力は、おそらくあなたにこのような警告を示しています

QObject::connect: No such slot QApplication::popup()

通常あなたがメイン・ウィンドウクラスの内部で、メインウィンドウの内部で使用されるものを入れてやりたいと思いますどのような。

例:コンストラクタ内にレイアウトを作成します。
オブジェクトを作成するときに親引数を使用すると、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: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout

0

は[OK]を、あなたはファイルmainwindow.cppに仕事をしなければなりません。あなたは既にスロットを作成し、そのスロットMainWindow::popUp();プットで今

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

(あなたは魔女はそれがui->setupUi(this);に書かれている機能であるMWコンストラクタですわからない場合)、それはメインウィンドウのコンストラクタで、このコードを追加接続していますこのコードは:

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(); 
    } 
+0

mainwindow.cpp:11:error: 'class Ui :: MainWindow'に 'btn'という名前のメンバーがありません connect(ui-> btn、SIGNAL clicked())、SLOT(popUp())); ^ – Viktor

+1

グラフィックビューでbtnという名前のプッシュボタングラフィックオブジェクトを作成しましたか?あなたがそれを描画する必要がない場合は – EmLe49

+0

mainwindow.ui(Formsで)ファイルを開くことができます作成​​し、ここであなたのオブジェクトを描画することができます – EmLe49

関連する問題