QT开发经验与资料大全

1. QT学习资源

1.1 推荐书籍

C++相关
  • 入门书籍 :《C++ Primer Plus》
  • 进阶书籍 :《C++ Primer》
QT相关
  • QT入门 :《Qt Creator快速入门》(霍亚飞)
  • QT进阶 :《C++ GUI Qt4编程》(官方文档)
  • QML学习 :《Qt5编程入门》
程序员成长
  • 《大话程序员》
  • 《程序员的成长课》
  • 《解忧程序员》

1.2 开发社区与资源

技术论坛与群组
名称 网址 QQ群
Qt技术交流群 - 46679801
Qt进阶之路群 - 734623697
开源Demo项目
技术博客与网站
开发工具资源
图表与UI资源

2. QT开发经验总结

2.1 编译与调试技巧

  • 遇到大量编译错误时,从第一个错误开始解决,后续错误往往由前序错误引起
  • 定时器使用技巧: QTimer::singleShot 可解决许多异步问题
  • 在构建套件环境中添加 MAKEFLAGS=-j8 启用多线程编译
  • Android部署前需先在Android Studio中完成环境配置

2.2 项目配置优化

// 版本号与图标设置(Qt5+)
VERSION = 2020.10.25
RC_ICONS = main.ico

// 管理员运行(MSVC)
QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator' uiAccess='false'"
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,"5.01"  // VC++6.0+兼容性

2.3 样式与绘图

// 移除旧样式并应用新样式
style()->unpolish(ui->btn);
style()->polish(ui->btn);

// 使用内置图标
SP_TitleBarMenuButton, SP_TitleBarMinButton, 
SP_TitleBarMaxButton, SP_TitleBarCloseButton

2.4 跨平台处理

// 根据操作系统位数判断加载路径
win32 {
    contains(DEFINES, WIN64) {
        DESTDIR = $${PWD}/../../bin64
    } else {
        DESTDIR = $${PWD}/../../bin32
    }
}

2.5 属性系统应用

// 获取对象所有属性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for(int i = 0; i < count; ++i) {
    QMetaProperty metaproperty = metaobject->property(i);
    const char *name = metaproperty.name();
    QVariant value = object->property(name);
    qDebug() << name << value;
}

3. 高级开发技巧

3.1 布局与控件组合

// 动态组合控件示例
QPushButton *btn = new QPushButton;
btn->resize(30, ui->lineEdit->height());
QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);

3.2 数据库优化

// SQLite内存数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");

// 确保获取全部数据
while(model->canFetchMore()) {
    model->fetchMore();
}

3.3 网络通信

// TCP保活设置
int fd = tcpSocket->socketDescriptor();
int keepAlive = 1;    // 开启keepalive
int keepIdle = 5;     // 5秒无数据开始探测
int keepInterval = 2; // 探测间隔2秒
int keepCount = 2;    // 探测重试次数

setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));

3.4 多线程注意事项

  • UI操作必须放在主线程
  • 数据库连接应在使用线程中打开
  • 避免过度使用线程,考虑操作实际耗时
  • 使用 deleteLater 而非 delete 安全释放对象

4. 常见问题解决方案

4.1 样式表失效

// QWidget派生类样式表解决方案
this->setAttribute(Qt::WA_StyledBackground, true);

// 或重写paintEvent
void Widget::paintEvent(QPaintEvent *) {
    QStyleOption option;
    option.initFrom(this);
    QPainter painter(this);
    style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}

4.2 高分屏适配

// 主函数开头启用高DPI缩放
#if QT_VERSION > QT_VERSION_CHECK(5,6,0)
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

4.3 部署问题

  • 缺少平台插件 :确保打包时包含 platforms 目录
  • WebEngine模块 :需同时打包 QtWebEngineProcess.exe 及相关资源
  • 第三方库依赖 :如FFmpeg需手动包含

5. 性能优化建议

5.1 文件操作

// 使用QTextStream提升文件读写性能
QFile file(":/propertyname.txt");
if(file.open(QFile::ReadOnly)) {
    QTextStream in(&file);
    while(!in.atEnd()) {
        QString line = in.readLine();
        processLine(line);
    }
    file.close();
}

5.2 表格控件优化

void initTableView(QTableView *tableView, int rowHeight, bool headVisible, bool edit) {
    // 基础设置
    tableView->setAlternatingRowColors(false);
    tableView->verticalHeader()->setVisible(headVisible);
    
    // 性能优化
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    
    // 编辑控制
    if(edit) {
        tableView->setEditTriggers(QAbstractItemView::CurrentChanged | 
                                  QAbstractItemView::DoubleClicked);
    } else {
        tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    }
}

5.3 避免性能陷阱

  • QGraphicsEffect :过度使用会导致CPU负载高
  • 频繁setPixmap :建议改用QPainter直接绘制
  • 不必要的样式重绘 :使用 WA_StaticContents 属性优化

6. 实用代码片段

6.1 日期时间处理

// 毫秒数转日期时间
QDateTime::fromMSecsSinceEpoch(1315193829218)
          .toString("yyyy-MM-dd hh:mm:ss:zzz");

// 日期时间转秒数
datetime.fromString("2011-09-10 12:07:50:541", 
                   "yyyy-MM-dd hh:mm:ss:zzz")
        .toTime_t();

6.2 颜色处理

// 根据背景色自动计算前景色
double gray = (0.299*color.red() + 0.587*color.green() + 0.114*color.blue()) / 255;
QColor textColor = gray > 0.5 ? Qt::black : Qt::white;

// 颜色格式转换
QColor color(255, 0, 0, 100);
qDebug() << color.name() << color.name(QColor::HexArgb); // #ff0000 #64ff0000

6.3 项目配置技巧

# 多项目顺序编译
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += demo \
           designer \
           examples

# 自定义编译输出目录
MOC_DIR     = temp/moc
RCC_DIR     = temp/rcc
UI_DIR      = temp/ui
OBJECTS_DIR = temp/obj
DESTDIR     = bin
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐