目录
一、根据自定义的文件目录结构新建工程
2.新建文件夹
3.将main.cpp剪切到src
main.qml剪切到qml文件夹
4.右键添加现有文件
5.更改pro工程文件中main.cpp路径
main.cpp中的main.qml路径
编译运行即可
二、QML与CPP通信
1.CPP调用qml组件的function
QML
import QtQuick 2.12
import QtQuick.Window 2.12
import QrQuick.Controls 2.5 as Controls
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello Qml && CPP")
controls.Lable {
objectName: 'labelinQml'
text: 'QML && CPP'
function getText() {
return text
}
}
}
CPP
#include <QGuiApplication>
#include <QQmlApplicationEngin>
#include <QMetaObject> //调用QML function 引入
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QCoreApplication::setAttrbute(Qt::AA_EnableHihgDpiScaling);
#endif
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj,const QUrl &objUrl) {
if(!obj && url == objUrl)
QCoreApplication::exit(-1);
},Qt::QueuedConnection);
engin.load(url);
//调用Qml Label的getText 函数
//实际很少使用到这种方法
auto root = engine.rootObjects();
auto labelQml = root.first()->findChild<QObject*>("labelinQml");
QVriant ret;
//无参
QMetaObject::invokeMethod(labelQml, "getText", Q_RETURN_ARG(QVariant, ret));
qDebug() << ret.toString();
// 有参
// QMetaObject::invokeMethod(labelQml, "getText", Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, "test"));
return app.exec();
}
2.QML调用CPP
CPP
#include <QGuiApplication>
#include <QQmlApplicationEngin>
#include <QMetaObject> //调用QML function 引入
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QCoreApplication::setAttrbute(Qt::AA_EnableHihgDpiScaling);
#endif
QGuiApplication app(argc, argv);
Person person("test",80)
QQmlApplicationEngine engine;
//注入实例到engin中
auto context = engine.rootContext(); //获取根上下文
context->setContextProperty("Person", &person); //设置上下文属性
const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine,&QQmlApplicationEngine::objectCreated,&app,[url](QObject *obj,const QUrl &objUrl) {
if(!obj && url == objUrl)
QCoreApplication::exit(-1);
},Qt::QueuedConnection);
engin.load(url);
return app.exec();
}
QML
import QtQuick 2.12
import QtQuick.Window 2.12
import QrQuick.Controls 2.5 as Controls
Window {
width: 640
height: 480
visible: true
title: qsTr("Hello Qml && CPP")
controls.Button {
text: 'click'
onClicked: {
Person.showInfo(); //调用CPP方法
}
}
}
3. QML与CPP 信号和槽 相互调用
一、添加常用第三方库
1.FFTW
FFTW是开源的dft / idft库,具有高效率易移植的特点。遵守GPL协议,具有商业付费服务。
windows下安装库
在网站 http://fftw.org/install/windows.html 下载压缩包
使用Visual studio的命令行工具lib,根据需要的版本生成.lib文件
lib /def:libfftw3-3.def
将.lib文件以及对应的.dll文件放入工程目录中
编辑.pro文件加入.lib文件及.dll路径
win32: LIBS += ../kc_sdr/thirdPartLib/fftw3/libfftw3-3.dll
win32: LIBS += -L../kc_sdr/thirdPartLib/fftw3/ -llibfftw3-3
注意:
-L后紧跟路径名,不能有空格
-l后紧跟.lib文件名不能带后缀
添加头文件
#include "thirdPartLib/fftw3/fftw3.h"
2. 提示 error: cannot find -llibfftw3-3
将前面的
win32: LIBS += ../kc_sdr/thirdPartLib/fftw3/libfftw3-3.dll
win32: LIBS += -L../kc_sdr/thirdPartLib/fftw3/ -llibfftw3-3
更改为
win64: LIBS += ../kc_sdr/thirdPartLib/fftw3/libfftw3-3.dll
win64: LIBS += -L../kc_sdr/thirdPartLib/fftw3/ -llibfftw3-3
编译通过
3.qt发送自定义signal,直接调用也可以,不使用emit
上下两种写法,效果相同
signal closed()
emit closed();
closed();
4.重写mouseMoveEvent 后鼠标移动需要按住才响应
需要勾选mouseTracking
四 Quick / QML
1. 注意Page 与 Window 的区别
Page 可以加Header 不能用menuBar
2. tbaleview 不同版本Control之间用法差别很大
可通过别名方式加载旧版本tableview 其他用新版本
import QtQuick.Controls 1.4 as QC14
import QtQuick.Controls.Styles 1.4 as QCS14
import QtQuick.Controls 2.1
QC14.TableView {
}