在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();
}
答案 0 :(得分:2)
QLabel label1
和QPushButton 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(¢ral);
}
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
我在Windows 10上工作。我在cygwin中做了最接近我手边的Linux的示例。
答案 1 :(得分:0)
我想在命令行级别从头开始
在这种情况下,您要么必须照顾所有必要的额外构建步骤,包括并自己联系,正如Dmitry已在评论中暗示的那样。或者你只是使用强烈推荐的qmake
,因为它会处理所有Qt特定的东西。