信号/插槽连接不起作用,没有警告或错误

时间:2013-05-16 18:34:25

标签: eclipse qt signals-slots

我正在使用Eclipse和Qt,甚至认为我写了一个简单的例子,它不起作用。出现带有按钮和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_ */

2 个答案:

答案 0 :(得分: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);

优良作法是声明构造函数,其中只有一个参数可以作为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: