(C ++) Code :: Блокирует возможную неправильную настройку для Qt4 - PullRequest
0 голосов
/ 23 июня 2010

ОС: 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 \ Release \ main.o: main.cpp || неопределенная ссылка на `vtable for Communicate '|

OBJ \ Release \ main.o: main.cpp || неопределенная ссылка на `vtable for Communicate '|

OBJ \ Release \ main.o: main.cpp || неопределенная ссылка на `vtable for Communicate '|

OBJ \ Release \ main.o: main.cpp || неопределенная ссылка на `vtable for Communicate '|

OBJ \ Release \ main.o: main.cpp || неопределенная ссылка на `vtable for Communicate '|

OBJ \ Release \ main.o: main.cpp || больше неопределенных ссылок на `vtable for Communicate 'следуют |

|| === Сборка завершена: 6 ошибок, 0 предупреждений === |

Я искал решение для форума code :: blocks и узнал, что должен быть установлен плагин Qt.

Итак, я устанавливаю плагин QtWorkbench 0.6.0 alpha -> qt, но ничего не изменилось.

Любые предложения приветствуются.

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Вы 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, который не требует явного перемещения. В Visual Studio я просто использую пользовательские шаги сборки.

0 голосов
/ 23 июня 2010

Попробуйте убрать вызов center () в конструкторе Communication. Я считаю, что это может быть причиной ваших ошибок.

...