我正在使用Eclipse和Qt,甚至认为我写了一个简单的例子,它不起作用。出现带有按钮和QLineEdit的小窗口,但是如果按下按钮,它在QLineEdit中什么都不写。我是初学者,所以我不知道自己写错了什么,或者说它不起作用。 我在Qt Designer中尝试了相同的例子,我得到了相同的结果。
#include "proj.h"
#include <QtGui>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
proj w;
w.show();
return a.exec();
}
#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
#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");
}
#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_ */
答案 0 :(得分: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文章。
答案 1 :(得分:0)
您的scrie()
方法应该是一个广告位,因此您必须将void scrie();
声明放在privates slots:
部分的.h文件中,而不仅仅是private:
。