Qt应用程序的单独课程

时间:2018-02-07 11:36:53

标签: qt

在Fedora 27 Linux下我想用Qt和C ++试用一个简单的Hello World示例。我创建了一个单独的GUI类,其中填充了标签和按钮。 init宏“Q_OBJECT”已被注释掉,因为它会产生错误消息。 (“未定义对MainWindow的vtable的引用”)编译源代码后,屏幕上会显示一个窗口,但缺少标签和按钮。我的意思是,编译过程有效,gui开始,但结果并不像预期的那样。

如果我把所有命令都放在main函数中而不创建一个单独的类,那么Qt效果很好。问题是定义一个继承自QMainWindow的单独类。大多数示例教程都使用Qt-Creator,但我想在命令行级别从头开始。任何提示都是受欢迎的。

// compile: clang++ -std=c++14 -lQtCore -lQtGui file.cpp
#include <QtGui/QApplication>
#include <QtGui/QPushButton>
#include <QtGui/QTextEdit>
#include <QtGui/QLabel> 
#include <QtGui/QMainWindow> 
#include <iostream>

class MainWindow : public QMainWindow {
  //Q_OBJECT
public:
  QWidget window;
  MainWindow() {
    window.resize(500, 400);
    QLabel label1( "input:" , &window);
    QPushButton button ("run", &window);
    button.move(0,300);
  }
  void show() {
    window.show();
  }
};

int main(int argc, char **argv)
{
  QApplication app (argc, argv);
  MainWindow mywindow;
  mywindow.show();
  return app.exec();
}

2 个答案:

答案 0 :(得分:2)

QLabel label1QPushButton button是构造函数MainWindow::MainWindow()中的局部变量。因此,当构造函数返回时,它们将超出范围并被销毁/删除。你必须使它们成为成员变量。 (这实际上是一个C ++问题。)

此外,我建议您了解Qt中的布局。 Qt doc。例如提供例子Basic Layouts Example

这是一个更小的我通过修改OP:

组成的

testQMainWindow.cc

#include <QtWidgets>

class MainWindow: public QMainWindow {
  private:
    QWidget central;
    QHBoxLayout hBox;
    QLabel label;
    QPushButton button;

  public:
    MainWindow();
};

MainWindow::MainWindow():
  hBox(this),
  label("input:", this),
  button("run", this)
{
  hBox.addWidget(&label, 1);
  hBox.addWidget(&button, 0);
  central.setLayout(&hBox);
  setCentralWidget(&central);
}

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  MainWindow win;
  win.show();
  return app.exec();
}

testQMainWindow.pro

SOURCES = testQMainWindow.cc

QT += widgets

编译和测试:

$ qmake-qt5 testQMainWindow.pro

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQMainWindow.o testQMainWindow.cc
g++  -o testQMainWindow.exe testQMainWindow.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQMainWindow 

snapshot of ./testQMainWindow

我在Windows 10上工作。我在cygwin中做了最接近我手边的Linux的示例。

答案 1 :(得分:0)

  

我想在命令行级别从头开始

在这种情况下,您要么必须照顾所有必要的额外构建步骤,包括并自己联系,正如Dmitry已在评论中暗示的那样。或者你只是使用强烈推荐的qmake,因为它会处理所有Qt特定的东西。