QT使用教程及常见问题

一、根据自定义的文件目录结构新建工程

在这里插入图片描述
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 {
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值