(C ++)Code ::阻止Qt4的错误设置

时间:2010-06-22 20:00:21

标签: c++ qt4 codeblocks

操作系统:Windows XP SP2, 编译器:Code :: Blocks ver。 10.05, Qt 4.6

我最近开始学习Qt。起初一切都很顺利,简单的啧啧示例。 我很快就遇到了一个无法编译并且意识到出了问题的例子。

以下是代码:

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


class Communicate : public QWidget
{
  Q_OBJECT

  public:
    Communicate(QWidget *parent = 0);

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

  private:
    QLabel *label;

};


 void center(QWidget *widget, int w, int h)
{
  int x, y;
  int screenWidth;
  int screenHeight;

  QDesktopWidget *desktop = QApplication::desktop();

  screenWidth = desktop->width();
  screenHeight = desktop->height();

  x = (screenWidth - w) / 2;
  y = (screenHeight - h) / 2;

  widget->move( x, y );
}


Communicate::Communicate(QWidget *parent)
    : QWidget(parent)
{
  int WIDTH = 350;
  int HEIGHT = 190;

  resize(WIDTH, HEIGHT);

  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()));


  center(this, WIDTH, HEIGHT);

}

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();
}

当我尝试打开它时,我收到此消息:

OBJ \发布\ main.o:main.cpp中||未定义引用`vtable for Communicate'|

OBJ \发布\ main.o:main.cpp中||未定义引用`vtable for Communicate'|

OBJ \发布\ main.o:main.cpp中||未定义引用`vtable for Communicate'|

OBJ \发布\ main.o:main.cpp中||未定义引用`vtable for Communicate'|

OBJ \发布\ main.o:main.cpp中||未定义引用`vtable for Communicate'|

OBJ \发布\ main.o:main.cpp中||更多未定义的引用`vtable for Communicate'跟随|

|| ===构建完成:6个错误,0个警告=== |

我一直在寻找代码:: blocks论坛的解决方案,并了解到应该安装Qt插件。

所以,我安装了QtWorkbench 0.6.0 alpha - &gt; qt插件但没有任何改变。

欢迎提出任何建议。

2 个答案:

答案 0 :(得分:2)

您是否moc此文件并包含moc输出以进行编译?

每当使用Q_OBJECT宏时,必须在该文件上使用Qt的moc命令生成一个新的cpp文件,该文件也应包含在要与项目一起编译的文件中。另外,我相信你只能使用一个头文件,因此你必须将你的类定义移动到一个单独的文件中并将该文件移动到那个文件中。

我不知道它对你的IDE是如何工作的,但是在命令行上你可以调用类似

的东西
<QT4 directory>\bin\moc.exe myfile.h -o moc_myfile.cpp

然后在项目中包含文件moc_myfile.cpp。

在某些IDE中,这是Qt插件为您所做的事情;它自动化所有这些步骤或使用qmake,它不需要明确的moc'ing。在Visual Studio中,我只使用自定义构建步骤。

答案 1 :(得分:0)

尝试在Communication构造函数中取出对center()的调用。我相信这可能会导致您的错误。