我收到大量粉丝提问:"学完C++/Qt技术栈后,如何通过实战串联知识点?
作为深耕C++/Qt领域的技术人,我始终认为通过真实项目实践是掌握技术栈的最佳方式。
今天我将以自研的"智汇协同Office"项目为例,深度剖析如何用Qt构建企业级桌面应用。
无论你是刚学完Qt基础的新手,还是想进阶提升的开发者,这个支持多文档处理、富文本编辑、打印预览的实战案例都将让你对Qt开发有全新认知。
本项目基于Qt 5.15 LTS版本开发,采用经典MVC架构:
核心组件:QMainWindow、QMdiArea、QTextEdit
关键技术栈:
class MyWord : public QMainWindow {
Q_OBJECT
public:
explicit MyWord(QWidget *parent = nullptr);
private:
// MDI区域
QMdiArea *mdiArea;
// 子文档管理
QMap childMap;
};
通过继承QMainWindow构建主框架,使用QMdiArea实现多文档容器。每个子窗口对应一个继承自QTextEdit的自定义类MyChild,实现文档独立性。
void MyChild::setFormatOnSelectedWord(const QTextCharFormat &format) {
QTextCursor cursor = textCursor();
if (!cursor.hasSelection())
cursor.select(QTextCursor::WordUnderCursor);
cursor.mergeCharFormat(format);
}
采用QTextCursor进行精准文本控制,支持:
// 工具栏按钮悬停事件
void MyWord::on_actionBold_hovered() {
statusBar()->showMessage("切换文字粗体样式", 2000);
}
// 文档修改状态监控
connect(child, &MyChild::textChanged, [=](){
statusBar()->showMessage("文档已修改", 1000);
});
通过重写QStatusBar的showMessage方法,结合Qt信号槽机制,实现操作反馈的实时同步。
void MyWord::tileSubWindows() {
QList windows = mdiArea->subWindowList();
int windowCount = windows.count();
if (windowCount == 0) return;
int rows = qCeil(qSqrt(windowCount));
int cols = qCeil(windowCount / double(rows));
mdiArea->tileSubWindows(rows, cols);
}
void MyChild::doPrintPreview() {
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer, this);
connect(&preview, &QPrintPreviewDialog::paintRequested,
this, &MyChild::printPreview);
preview.exec();
}
通过QPrinter实现打印参数配置,配合QPrintPreviewDialog构建所见即所得的预览系统。
技术栈:QMdiArea + 子窗口管理
// 主窗口类定义
class MyWord : public QMainWindow {
Q_OBJECT
public:
explicit MyWord(QWidget *parent = nullptr);
private:
QMdiArea *mdiArea; // MDI容器
QMap childMap; // 子窗口映射
};
// 创建新文档
void MyWord::onFileNew() {
MyChild *child = new MyChild(this);
QMdiSubWindow *subWindow = mdiArea->addSubWindow(child);
childMap.insert(subWindow, child);
}
关键技术点:
技术栈:QFile + QDataStream序列化
// 自定义文件格式读写
void MyChild::writeFile(const QString &fileName) {
QFile file(fileName);
if(file.open(QIODevice::WriteOnly)) {
QDataStream out(&file);
out << m_htmlContent << m_textColor << m_fontSize;
}
}
// 工具栏悬停提示
connect(ui->actionSave, &QAction::hovered, [=](){
statusBar()->showMessage("保存当前文档至本地", 1500);
});
// 实时字数统计
connect(this, &MyChild::textChanged, [=](){
statusBar()->showMessage(QString("字数:%1").arg(document()->characterCount()));
});
在数字化转型浪潮下,Qt在工业控制、医疗设备、汽车仪表等领域的市场占有率持续攀升。据报告显示,全球超过70%的工业控制软件和85%的汽车中控系统采用Qt开发。掌握Qt技术栈,意味着打开通往嵌入式开发/工业软件/跨平台应用的三重职业通道。