1

私はQtでEclipseを使用していますが、簡単な例を書いたと思ってもうまくいきません。ボタンと QLineEdit のある小さなウィンドウが表示されますが、ボタンを押しても QLineEdit には何も書き込まれません。私は初心者なので、何か間違ったことを書いたのか、それともうまくいかないのかわかりません。Qt Designer で同じ例を試しましたが、同じ結果が得られました。

main.cpp

#include "proj.h"

#include <QtGui>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    proj w;
    w.show();
    return a.exec();
}

proj.h

#ifndef PROJ_H
#define PROJ_H

#include <QtGui/QWidget>
#include "ui_proj.h"
#include "testUi.h"

class proj : public QWidget
{
    Q_OBJECT

public:
    proj(QWidget *parent = 0);
    ~proj();

private:
    TestUi ui;
    void connection();
    void scrie();
};
#endif // PROJ_H

proj.cpp

#include "proj.h"

proj::proj(QWidget *parent) : QWidget(parent)
{ 
    ui.setupUi(this);
    connection();
}

proj::~proj(){}

void proj::connection(){
    QObject::connect(ui.btn, SIGNAL(clicked()), this, SLOT(scrie()));
}

void proj::scrie(){
    QMessageBox::information(this, "Information", ".....");
    ui.ed->setText("a scris");
}

testUI.h

#include <QtGui>
#include <QApplication>
#include <qboxlayout.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qobject.h>
#include <qwidget.h>

#ifndef TESTUI_H_
#define TESTUI_H_

class TestUi{
public:
QPushButton *btn;
QLineEdit *ed;
public:
    void setupUi(QWidget *w){
        QHBoxLayout *lay = new QHBoxLayout;
        w->setLayout(lay);

        btn = new QPushButton;
        ed = new QLineEdit;

        lay->addWidget(btn);
        lay->addWidget(ed);
    } 
};   

#endif /* TESTUI_H_ */
4

2 に答える 2

1

あなたのコードには多くの問題が見つかりました。

SIGNALS と SLOTS の接続。

proj::scrie実際には SLOT ではないため、接続は機能しません。SLOT を作成するにはslots、クラス宣言でセクションを宣言する必要があります。

private slots:
    void scrie();

接続はコンパイル時の機能ではないため、エラーが発生してもプロジェクトは正常にコンパイルされます。ただし、実行時にいくつかのチェックを行い、コンソールに のような警告を表示する必要がありますObject::connect: No such slot proj::scrie() in proj.cpp:12。コンソール出力を確認してください。

明示的なコンストラクター

クラスには、次のコンストラクターの宣言があります。

proj(QWidget *parent = 0);

1 つの引数のみを として渡すことができるコンストラクターを宣言することをお勧めしexplicitます。これにより、暗黙的な変換を防ぐことができます。

含む

この方法で Qt のヘッダー ファイルをインクルードしないでください。

#include <qboxlayout.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qobject.h>
#include <qwidget.h>

これらのヘッダーが次のバージョンの Qt で使用できるという保証はありません。次のように含める必要があります。

#include <QBoxLayout>
#include <QPushButton>
#include <QObject>

等々。

ガードを含める

「インクルードガード」の前に「インクルード」ディレクティブがいくつかあります。エラーではありませんが、ヘッダー全体をガードで挟んだ方が良いでしょう。

カプセル化

public でデータ メンバーを宣言しないでください。「プライベート」クラスを使用する場合は、 http: //qt-project.org/wiki/Dpointerの記事を参照してください。

于 2013-05-16T18:57:36.083 に答える