当我们从网上或者从打开别人的工程师,报错,C1083: 无法打开包括文件: “QtGui/QApplication”。
原因:Qt5里不再用QtGui模块,而是使用QtWidgets模块。
error: C1083: 无法打开包括文件: “QMainWindow”: No such file or directory
error: C1083: 无法打开包括文件: “QGraphicsItem”: No such file or directory
error: C1083: 无法打开包括文件: “QGraphicsView”: No such file or directory
error: ‘QApplication’ file not found
error: C1083: 无法打开包括文件: “QtGui/QApplication”: No such file or directory
报错是因为我们用Qt5打开Qt4版本时,Qt5里不再用QtGui模块,而是使用QtWidgets模块。
Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块。随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系。
最终:在Qt5下的GUI编程,有两套不同的东西
QtWidget (使用一个被称为 BackingStore 的东西)
QtQuick (使用一个被称为 Scene Graph 的东西)
Qt4中的QDeclarativeView等一系列的东西被改成了QQuickView和QQmlItem等分别放到了QtQuick和QtQml模块。
QQuickView这一套框架完全脱离了QWidget的束缚,一路从QSurface到QWindow继承下来,虽说是窗口,但感觉却又不像是窗口。
QQuickView本能是使用OpenGL,使用硬件加速。
QQuickView 提供了一个窗体用于显示UI
QQmlEngine 提供QML运行的环境
QQuickWindow 显示窗体,以及对item对象的管理及用户交互
QQmlApplicationEngine 从Qt5.1开始提供的一个便捷对象 包含QQmlEngine和QQmlComponent能够根据一个qml文件创建一个application。
QQmlContext 类为对象的实例化以及表达式的评估提供了一个上下文环境。所有的对象都在一个特定的上下文中实例化,并且应用程序运行中要执行的表达式都在一个特定的上下文中执行。这个上下文定义了符号是如何被解析的,以及表达式操作的值。
QQmlComponent 类可以用来加载QML文档。它需要QQmlEngine来实例化定义在QML文档中的对象层次
一个典型的QML应用程序有一个C++函数的入口点,该入口点是:实例化一个QQmlEngine并且使用QQmlComponent加载一个QML文档。引擎(QQmlEngine对象)提供了一个默认的QQmlContext,这是一个顶级的上下文,用于执行定义在QML文档中的方法和表达式。定义在QML文档中的对象层次将会通过调用QQmlComponent实例化对象的create()方法被实例化。
客户端可能需要通过注入属性或者对象到上下文中修改引擎提供的默认QQmlContext。它们可以通过调用QQmlEngine::rootContext()方法来访问顶级的上下文。
在实例化对象之后,客户端通常就将控制权传递给应用程序的事件循环,以使得用户输入时间(例如鼠标点击)可以被应用程序分发和处理。
QML里面Row代表一行数据,所以item是按列来排的
QML里面Column是代表一列数据,所以Item是按行排的
在Row和Column中anchors(锚点)是不起作用的
RowLayout和ColumnLayout 也是代表一行与一列但是提供了多种的Layout附加属性并且可以使用anchors
在pro文件中加入:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
删除:#include
添加:#include
重新 qmake 再重新编译工程
//#include
#include "mainwindow.h"
#include "target.h"
#include
#include "radarview.h"
#include
#include
#include
static const int TargetCount = 200;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//w.show();
// QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
QGraphicsScene scene;
scene.setSceneRect(-400,-300,800,600);
scene.setItemIndexMethod(QGraphicsScene::NoIndex);
for(int i = 0; i < TargetCount; ++i)
{
Target * target = new Target;
target->setPos(qrand()%800 - 400, qrand()%600 -300);
target->setVisible(true);
scene.addItem(target);
}
radarView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
view.setBackgroundBrush(QColor(0,0,0));
view.setCacheMode(QGraphicsView::CacheBackground);
view.setDragMode(QGraphicsView::ScrollHandDrag);
view.setWindowTitle(QObject::tr("haizhan"));
view.resize(800,600);
view.show();
return a.exec();
}
不要想着安了Qt5,就直接用他来继续之前Qt4写的工程,不如还是用Qt4吧,有新工程从头开始可以使用Qt5。虽然digia官方说完美支持Qt4,一般情况下还是要修改配置的。