Qt学习笔记

文章介绍了在C++Qt项目中使用CMAKE管理翻译文件的步骤,包括lupdate和lrelease的使用。另外,讨论了如何设置QWidget的图标,以及在无边框窗口中处理鼠标事件的问题。还提到了QML与C++的交互,QQuickWidget的使用,以及在QML和QWidget混用时遇到的挑战和解决方案,如避免窗口黑屏的问题。同时,文章提及了支持高分辨率显示的设置和使用QEventLoop进行异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、CMAKE- Qt

翻译

c++ QT中cmake项目翻译

  • 准备语句
    放到 上级的CMakeList里
set(TS_DIR "${CMAKE_CURRENT_SOURCE_DIR}")/../../YourFolder/translate

find_program(LUPDATE_EXECUTABLE lupdate)
find_program(LRELEASE_EXECUTABLE lrelease)
  • lupdate

#需要加载翻译工具
# find_package(LinguistTools REQUIRED)

set(TS_FILES
    "${TS_DIR}/${PROJECT_NAME}_zh_cn.ts"
)

foreach(_ts_file ${TS_FILES})
    execute_process(
        COMMAND ${LUPDATE_EXECUTABLE } -recursive ${CMAKE_CURRENT_SOURCE_DIR} -ts ${_ts_file})
endforeach()

##lrelease end
  • lrelease

#获取所有的翻译ts文件 
file( GLOB TS_FILES    ${TS_DIR}/*.ts)
 
##编译时更新.ts .qm
foreach(_ts_file ${TS_FILES}) 
    execute_process(COMMAND lrelease ${_ts_file})
endforeach()
##lurelease end

放到其他目录:

set(_ts_file "d:/ddd/translate.ts")
message(${_ts_file})
string(REGEX MATCHALL "[0-9A-Za-z_]*.ts" fileName ${_ts_file})
message(${fileName})

string(REGEX REPLACE ".ts" ".qm" newFileName ${fileName})
message(${newFileName})
#然后组织你的新位置
set(_qm_file "d:/ddd/qm/${newFileName}")

2、QWidget

Icon设定WindowsIcon的方法

可以避开ico文件

QIcon icon;
icon.addFile(QString::fromUtf8(":/resources/Resources/images/sample.svg"), QSize(),
             QIcon::Normal, QIcon::Off);
this->setWindowIcon(icon);

Widget变成Native窗口可能引起的问题

在无边框可拖动的主界面标题栏鼠标事件被别的Native窗口接收,无法响应鼠标事件

QLabel等基础布局都变成拥有句柄的window,在nativeEventFilter过滤事件时候需要考虑这些基础部件
如何防止子部件Native化呢?
QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
QApplication::setAttribute(Qt::AA_NativeWindows,false);
//Qt::AA_NativeWindows受环境变量
QT_USE_NATIVE_WINDOWS控制,有可能环境变量被别的软件修改,所以也需要设置下
在有widget调用winId的之前widget->setAttribute(Qt::WA_DontCreateNativeAncestors);

问题:如果用了AA_DontCreateNativeWidgetSiblings
会导致QQmlApplicationEngine engine;出错
提示 没有创建 QApplication。

最小化后恢复界面假死冻结

void showEvent(QShowEvent *e)
{
setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}

设置支持高分辨率

QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

使用QEventLoop同步获取返回结果而不阻塞界面

QEventLoop loop;
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

无边框窗体可自由拉伸边框

setWindowFlags(Qt::CustomizeWindowHint);

这个效果,标题栏变得很窄,但是四边可以拉伸
在这里插入图片描述

继承QWidget样式表不起作用

setAttribute(Qt::WA_StyledBackground, true);
 
void Widget::paintEvent(QPaintEvent *)
{
QStyleOption option;
option.initFrom(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}

3、 QML

QQuickWidget和C++交互

QQuickWidget与qml文件的交互1 - 设置上下文属性_风烟倦的博客-优快云博客

imeData data; 
ui->quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
ui->quickWidget->rootContext()->setContextProperty("TestData", &data);
ui->quickWidget->setSource(QUrl("qrc:/main.qml"));

QML 和QWidget混用

实际上就是QWdget和 QQuickQidget混用,不是QWidget插入到QML里面
QWidget的Native化及解决_我的绿茶的博客-优快云博客
Qt::AA_DontCreateNativeWidgetSiblings

  • 问题:QMLQuickWidget和QWidget混用时,QML的窗口黑窗,无法直接显示。
QCoreApplication::setAttribute(Qt:: AA_DontCreateNativeWidgetSiblings); 原文:Ensures that siblings of native

widgets stay non-native unless specifically set by the
Qt::WA_NativeWindow attribute. 翻译:确保本机小部件的同级保持非本机状态,除非由Qt::WA\u
NativeWindow属性专门设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄鸭code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值