Qt:信号和插槽以及Q_OBJECT

时间:2013-02-22 22:14:40

标签: qt qpushbutton

我在Qt编写了一个程序,它工作正常,但点击按钮不起作用。 当我在类声明之后使用Q_OBJECT时,它会给我编译错误。

这是我的代码:

    #include <QApplication>
    #include <QPushButton>
    #include <QLabel>
    #include <QWidget>

    class Communicate : public QWidget
    {
     // Q_OBJECT

      public:
        Communicate(QWidget *parent = 0);

      private slots:
        void OnPlus();
        void OnMinus();

      private:
        QLabel *label;

    };

    Communicate::Communicate(QWidget *parent)
        : QWidget(parent)
    {
      QPushButton *plus = new QPushButton("+", this);
      plus->setGeometry(50, 40, 75, 30);

      QPushButton *minus = new QPushButton("-", this);
      minus->setGeometry(50, 100, 75, 30);

      label = new QLabel("0", this);
      label->setGeometry(190, 80, 20, 30);

      connect(plus, SIGNAL(clicked()), this, SLOT(OnPlus()));
      connect(minus, SIGNAL(clicked()), this, SLOT(OnMinus()));
    }

    void Communicate::OnPlus()
    {
      int val = label->text().toInt();
      val++;
      label->setText(QString::number(val));
    }

    void Communicate::OnMinus()
    {
      int val = label->text().toInt();
      val--;
      label->setText(QString::number(val));
    }

    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);

      Communicate window;

      window.setWindowTitle("Communicate");
      window.show();

      return app.exec();
    }

2 个答案:

答案 0 :(得分:1)

您需要通过moc运行包含Q_OBJECT宏的文件,并将其输出与其他应用程序一起编译和链接。这取决于您的构建系统,这会自动发生(qmake)或添加一行左右(cmake)

答案 1 :(得分:0)

使用O_QBJECT宏并更正您可以获得的错误:

1)在它自己的.h文件中声明你的QWidget / QObject派生类,并在它自己的.cpp文件中定义它。

2)包含你在.cpp中的类定义之后由moc生成的.moc文件(添加类似#include“xxxx.moc”)

LE:你也想使用布局而不是使用setGeometry将你的小部件放到窗口中,阅读更多here