QT5.0乱码问题
不能用QTextCodec解决乱码问题,需要用QStringLiteral("我是中文")
QML笔记
QML加载自定义控件提示"xxx is not type"
原因: 路径找不到
在main.cpp里把加载主窗口
engine.load(QUrl(QStringLiteral("qrc:qml/main.qml")));
修改成
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
神奇的事情发生了,这样就可以直接加载qml下面的其他xxx.qml文件了
码流图片实时刷新至QML界面
-
继承QQuickImageProvider类,并实现requestImage接口
构造函数调用父类构造函数,设为至Image
AEScreenImageProvider::AEScreenImageProvider():QQuickImageProvider(QQuickImageProvider::Image){}
实现requestImage接口
QImage AEScreenImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { return this->m_img; }
m_img是待传到QML界面的图片,该图片由码流转QImage
传入的参数id 是指image://provider/id里的id,可以自定义值
-
QML文件按如下编写:
Image { id: screenImg anchors.centerIn: parent width: 1280 height: 720 sourceSize.height: 720 sourceSize.width: 1280 cache: false } Connections { target: aeclient onCallQmlRefeshImg: { screenImg.source="" screenImg.source="image://aecreen" } }
aeclient是后台解析码流生成QImage类,每解析一帧,发送一个callQmlRefeshImg信号, QML通过onCallQmlRefeshImg接收信号刷新页面
emit callQmlRefeshImg(); //告诉qml要刷新图片
Image有缓存机制, 通过设置cache为false和screenImg.source="" 进行清空缓存,否则不会刷新下一张图片, cache默认是true
-
在main里按如下编写:
AEClient *pClient = new AEClient(); QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("aeclient", pClient); engine.addImageProvider(QLatin1String("aecreen"), pClient->imgProvider());
pClient注册到QML的根节点,这样在界面就可以通过aeclient别名进行调用
aecreen注册到QML里,通过image://aecreen方式调用AEScreenImageProvider
配置使用Material风格界面
-
方法一:
在main.cpp里添加如下代码
if (qgetenv("QT_LABS_CONTROLS_STYLE").isEmpty()){ qputenv("QT_LABS_CONTROLS_STYLE", "material"); }
-
方法二:
在项目根路径创建文件qtquickcontrols2.conf,并把如下内容写到文件:
; This file can be edited to change the style of the application ; Read "Qt Quick Controls 2 Configuration File" for details: ; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html [Controls] Style=Material [Material] Theme=Dark ;Accent=BlueGrey ;Primary=BlueGray ;Foreground=Brown ;Background=Grey
把该文件添加到qrc资源文件里
在main.cpp里添加如下代码:
engine.addImportPath("qrc:qtquickcontrols2.conf");
Rectangle自适应Layout
-
当Layout包含了Rectangle时,需要Rect随Layout变化而变化,按如下设计:
Layout{ Rectangle { Layout.fillWidth: true; Layout.fillHeight: true; } }
QT发布依赖dll
Qt 提供了打包工具windeployqt, 利用该工具可以很方便的解决qt的依赖问题
qt源码编译release后,生成exe文件,找到生成的exe文件(以下以test.exe作为例子),将exe文件拷贝到其他地方。例如: D:/test
通过cd命令道test.exe存放的地方,并输入下面的命令:
windeployqt -qmldir "源码路径" test.exe --release
命令执行完后,在D:/test下将生成qt的依赖文件。 如果你的源码使用了三方库或者生成了动态链接库,那么需要手动将需要的dll文件复制到目录下,实际
运行试试,是不是可以正常运行。
解决遮罩还能点击遮罩层下面控件问题
遮罩层需要处理鼠标点击事件,使不往下再发送事件信号
Rectangle {
id: progress
anchors.fill: parent
color: "#00000000"
z: 99
visible: false
Rectangle {
anchors.fill: parent
opacity: 0.5
color: "white"
}
Column {
anchors.fill: parent
//anchors.centerIn: parent
spacing: 20
Text {
text: "正在计算目录: E:/a/b/..."
color: "white"
font.pixelSize: 20
anchors.centerIn: parent
}
ProgressBar {
indeterminate: true
focusPolicy: Qt.NoFocus
anchors.centerIn: parent
}
}
MouseArea{
anchors.fill: parent;
onPressed:{
mouse.accepted = true
}
drag.target: window // root可拖动
}
}
网友评论