常见问题"/>
QT使用教程及常见问题
目录
- 一、根据自定义的文件目录结构新建工程
- 二、QML与CPP通信
- 1.CPP调用qml组件的function
- 2.QML调用CPP
- 3. QML与CPP 信号和槽 相互调用
- 一、添加常用第三方库
- 1.FFTW
- 2. 提示 error: cannot find -llibfftw3-3
- 3.qt发送自定义signal,直接调用也可以,不使用emit
- 4.重写mouseMoveEvent 后鼠标移动需要按住才响应
- 四 Quick / QML
- 1. 注意Page 与 Window 的区别
- 2. tbaleview 不同版本Control之间用法差别很大
一、根据自定义的文件目录结构新建工程
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 ControlsWindow {width: 640height: 480visible: truetitle: 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);
#endifQGuiApplication 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);
#endifQGuiApplication 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 ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello Qml && CPP")controls.Button {text: 'click'onClicked: {Person.showInfo(); //调用CPP方法}}
}
3. QML与CPP 信号和槽 相互调用
一、添加常用第三方库
参考链接
1.FFTW
FFTW是开源的dft / idft库,具有高效率易移植的特点。遵守GPL协议,具有商业付费服务。
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.1QC14.TableView {}
更多推荐
QT使用教程及常见问题
发布评论