操作系统:opensuse 语言:Qt 数据库:微软的ms sql server
用的是unixodbc+freetds+Qt的方式操作ms sql server
问题:如果在QSqlQuery.exec()的过程中网络断了,就会一直阻塞,这不是我们想要的,需要一个运行超时的机制,
怎么办
QSqlDatabase::setConnectOptions ( const QString & options = QString() ) 对某些数据库可以设置连接选择,但是无法解决我们的问题。
后面突然想到可以利用freetds的配置文件做文章
修改/etc/freetds.conf中的global选项,如下有timout的配置
[global]
# Command and connection timeouts
timeout = 10
connect timeout = 10
经过测试,在exec的过程中强行关掉网络,大概会于20S左右失败退出,至于为什么会比10S长这么多,暂时不是很明白,但至少超时问题解决了。
Qt
1. Qt框架概述
Qt是一个跨平台的C++应用程序开发框架,广泛用于开发GUI程序、嵌入式系统、移动应用及企业级软件。其核心优势包括:
- 跨平台支持: Windows/Linux/macOS/Android/iOS/嵌入式系统。
- 模块化设计: 提供GUI、网络、数据库、多媒体等独立模块。
- 信号槽机制: 独特的对象间通信方式(取代回调函数)。
- 开源与商业双许可: LGPLv3或商业许可。
2. Qt核心模块
模块名 | 功能描述 |
---|---|
Qt Widgets | 传统桌面GUI组件(按钮、窗口等),基于CPU渲染 |
Qt Quick | 现代UI框架(QML语言+JavaScript),支持硬件加速,适合动态界面 |
Qt Network | TCP/UDP/HTTP等网络通信功能 |
Qt SQL | 数据库访问(支持MySQL/PostgreSQL/SQLite等) |
Qt Multimedia | 音视频播放与录制 |
Qt WebEngine | 基于Chromium的浏览器引擎 |
3. Qt开发模式对比
(1) Qt Widgets (传统C++方式)
- 适用场景: 复杂桌面应用(如IDE、工业软件)
- 代码示例:
// C++创建窗口
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QPushButton button("Hello Qt!");
button.show();
return app.exec();
}
(2) Qt Quick (QML声明式UI)
- 适用场景: 移动端/嵌入式触控界面、动画密集型应用
- 代码示例:
// QML定义界面
import QtQuick 2.0
Rectangle {
width: 200; height: 100
Text { text: "Hello QML!"; anchors.centerIn: parent }
}
4. Qt信号槽机制
Qt的核心通信机制,相比回调函数的优势:
- 类型安全: 编译时检查参数类型。
- 松耦合: 发送者无需知道接收者存在。
- 示例代码:
// C++中连接信号与槽
QObject::connect(
sender, &Sender::valueChanged, //信号
receiver, &Receiver::updateValue //槽
);
// QML中信号处理
Button {
onClicked: { console.log("Clicked!") } //内置信号处理器
}
5. Qt跨平台开发实践
(1) 平台特定代码处理
#ifdef Q_OS_WIN
// Windows专用代码
#elif defined(Q_OS_ANDROID)
// Android专用代码
#endif
(2) 响应式UI设计
- DPI适配:
Text { font.pixelSize: Qt.application.font.pixelSize * 1.5 }
- 多语言支持:
.ts
文件 +lupdate
/lrelease
工具链。
6. Qt与Android/iOS集成
(1) Android开发注意事项
- 部署配置:
android {
QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
}
- Java互操作:
QAndroidJniObject::callStaticMethod<void>(
"org/qtproject/example/JavaClass",
"showToast",
"(Landroid/content/Context;Ljava/lang/String;)V",
QtAndroid::androidContext(),
QAndroidJniObject::fromString("Hello from Qt!").object()
);
(2) iOS开发限制
- App Store要求使用Metal渲染器(Qt默认支持)。
7. Qt性能优化技巧
- 内存管理:
- QObject派生类自动父子内存管理。
- 避免在QML中创建过多动态对象。
- 渲染优化:
- Widgets应用启用
QT_QUICK_BACKEND=software
回退。 - Quick应用使用
ShaderEffectSource
复用纹理。
- Widgets应用启用
8. Qt6新特性
- 重大改进:
- CMake成为默认构建系统(替代qmake)。
- QML强类型系统(required properties)。
- 模块变化:
- Qt Quick Controls移出主仓库。
- OpenGL替换为RHI(Render Hardware Interface)。
9. Qt应用案例
- 知名产品:
- Autodesk Maya (3D建模)
- Tesla车载UI
- WPS Office (Linux版)
- 行业应用:
医疗设备GUI、工业控制系统、智能家居中控。
10.学习资源推荐
- 官方文档
- 《C++ GUI Programming with Qt4/5》
- Qt官方示例(安装包自带)
通过掌握Qt的核心机制和跨平台策略,开发者可以高效构建高性能的现代应用程序。建议从Qt Widgets入门,再逐步学习Qt Quick以满足不同场景需求。
作者:帅得不敢出门 程序员群:31843264