1

I'm using Eclipse with Qt and even thought I wrote a simple example, it doesn't work. The small window with a button and a QLineEdit appears, but if I push the button, it writes nothing in the QLineEdit. I'm a beginner, so I don't know if I've wrote something wrong or it just doesn't work. I've tried the same example in Qt Designer, and I had the same result.

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

我在你的代码中发现了很多问题。

信号和插槽的连接。

连接不起作用,因为proj::scrie实际上不是 SLOT。为了制作 SLOT,您必须slots在类声明中声明部分。

private slots:
    void scrie();

连接不是编译时功能,因此即使出现错误,项目也能正常编译。但是在运行时它会进行一些检查,并且应该在控制台中提供警告,例如Object::connect: No such slot proj::scrie() in proj.cpp:12. 请查看控制台输出。

显式构造函数

您的类具有以下构造函数声明:

proj(QWidget *parent = 0);

最好声明构造函数,其中只能将一个参数作为explicit. 它使您可以防止隐式转换。

包括

请不要以这种方式包含 Qt 的头文件:

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

不保证这些头文件将在以下 Qt 版本中可用。你应该像这样包括它:

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

等等。

包括警卫

您在“包含守卫”之前放置了一些“包含”指令。这不是错误,但最好将整个头部主体放在守卫之间。

封装

不要公开声明数据成员。如果您想使用“私有”类,请查看http://qt-project.org/wiki/Dpointer文章。

于 2013-05-16T18:57:36.083 回答
0

您的scrie()方法是一个插槽,因此您必须将void scrie();声明放在 .h 文件的privates slots:部分中,而不仅仅是private:.

于 2013-05-16T18:43:55.787 回答