资源描述
Qt简 介Qt的 作 用Qt的 特 性 及 优 势包 含 Qt的 系 统 的 架 构如 何 学 习 Qt Qt简 介 图 形 用 户 界 面( Graphical User Interface) 是 指 采 用 图 形 方 式显 示 的 计 算 机 操 作 用 户 界 面对 比 : 早 期 的 操 作 系 统 , 如 DOS, CUI(Command line User Interface)命 令 行 模 式 的 人 机 接 口组 成 部 分 : 桌 面 、 视 窗 、 菜 单 、 按 钮 、 图 标 等Qt是 跨 平 台 的 C+应 用 程 序 和 UI开 发 的 框 架Qt4有 超 过 500个 类 和 9000多 个 函 数 , 使 用 Qt可以 迅 速 开 发 出 期 望 的 应 用 程 序 Qt在 整 个 产 品 开 发 中 的 作 用构 建 桌 面 环 境 ;为 应 用 程 序 提 供 可 视 化 的 、 友 好 的 界 面 ;利 用 Qt类 库 自 带 的 功 能 构 建 复 杂 应 用 程 序 ;使 用 Qt构 建 的 产 品 : http:/ Qt的 特 性 及 优 势 易 于 获 取 , 个 人 应 用 完 全 免 费全 面 的 、 艺 术 级 的 应 用 程 序 框 架良 好 的 跨 平 台 性 , 一 劳 永 逸多 语 言 的 支 持 包 含 Qt的 系 统 的 架 构 包 含 Qt的 系 统 的 架 构 学 习 Qt可 用 的 资 源 NO1: Qt参 考 文 档 , 包 括 类 的 简 介 、 类 相 关 函 数 的 介绍 、 自 带 例 程 的 源 码 及 讲 解 、 函 数 的 查 找 和 使 用 、 核心 特 性 、 关 键 技 术 等NO2:www.qtcn.org Qt中 文 论 坛 NO3: C+GUI Programming with Qt4,Second Edition -官 方 参 考 文 档 , 讲 解 精 到 Qt学 习 方 法NO1: 学 习 Qt自 带 教 程 , Qt的 example及 其 参 考 代 码 。参 考 qtdemo程 序 , 学 习 demo完 成 自 己 的 程 序 。NO2: 阅 读 书 籍 , 随 书 进 行 编 程 练 习 。 如 C+GUI Qt4编 程 , 提 供 有 完 善 的 代 码 Qt程 序 开 发QtCreator介 绍Hello Qt!程 序 开 发 流 程几 个 Qt练 习 Qt Creator的 设 计 目 标 是 使 开 发 人 员 能 够 利 用 Qt 这 个 应 用 程 序 框 架 更 加 快 速 及 轻 易 的 完 成 开 发 任 务 。Nokia 收 购 Qt之 后 在 Qt的 工 具 上 做 了 很 大 的 工 作 ,推 出 的 一 款 新 的 轻 量 级 集 成 开 发 环 境 (IDE), 即 QtCreator。QtCreator IDE 能 够 跨 平 台 运 行 , 支 持 的 系 统 包 括 Linux ( 32 位 及 64 位 ) 、 Mac OS、 Windows等 。 功 能 介 绍 :项 目 生 成 向 导高 级 C+ 代 码 编 辑 器文 件 及 类 管 理 工 具集 成 了 Qt Designer集 成 了 qmake 构 建 工 具集 成 了 图 形 化 的 GDB 调 试 前 端 利 用 QtCreator开 发 Qt应 用 程 序 的 基 本 流 程 : 创 建 工 程 项 工 程 中 添 加 文 件 设 计 界 面 编 写 代 码 实 现 功 能 调 试 运 行 创 建 工 程打 开 QtCreator, “ File-New File or Project”, 选 择 “Qt4 Gui Application” 输 入 工 程 名 称 : 如 ex01_helloQt选 择 工 程 路 径 : 如 D:project 根 据 应 用 选 择 功 能 模 块 , 此 工 程 保 持 默 认 即 可 。 创 建 Qt4 Gui Application时 ,向 导 会 自 动 生 成 一 个 新 类 , 将 来 可 在 该 类 中 完 成 应 用 程 序 的 功 能 。此 步 设 置 该 类 名 称 , 选 择 基 类 名 称 , 及 设 置 该 类 代 码 的 文 件 名 称另 外 , 设 置 是 否 要 生 成 UI文 件 , 如 果 生 成 则 , 将 来 可 以 在 UI文 件 中 来 绘 制 界 面 。 最 后 一 步 “ Finish”即 可 完 成 工 程 创 建 在 工 程 管 理 窗 口 中 双 击 Forms下 的 mywidget.ui(UI文 件 ), 即 可 打开 Qt Designer(Qt界 面 设 计 器 )在 Designer中 设 计 界 面 编 译 运 行 程 序 : 在 工 程 名 上 右 键 , 选 择 Run 运 行 效 果 : 练 习 1: 隐 藏 “ HelloQt!” 设 计 两 个 按 钮 和 一 个 Label,当 点 击 “ show”按 钮 时 显 示 “ HelloQt!”,点 击 “ Hide”按 钮 时 隐 藏 “ HelloQt!”。 按 照 Hello t方 法 创 建 工 程 , 并 绘 制 界 面 。 添 加 功 能 : t使 用 信 号 和 槽 机 制 可 以 很 容 易 的 实 现 对 象 之 间 的 通 信 , 当 某 些 事 件 发 生 时 , 对 应 的 信 号 会 被 发 送 。可 以 将 一 个 对 象 的 信 号 和 其 他 对 象 的 槽 相 连 , 这 样 , 当 信 号 发 送 是 , 和 他 相 连 的 槽 函 数 即 可 被 调 用 。 编 辑 信 号 和 槽 : Edit-Edit signal/slots (F4)编 辑 对 象 : Edit-Edit idgets (F3)F4之 后 , 左 键 拖 动 “ Show”到 “ HelloQT”上 , 释 放 鼠 标 , 会 弹 出信 号 和 槽 对 话 框 选 择 连 接 clicked()信 号 和 show()槽 同 样 的 方 法 连 接 “ Hide”的 clicked()信 号 和 “ HelloQt”的 show()槽 连 接 好 后 如 下 图 示如 果 要 编 辑 部 件 , 按 F3回 到 部 件 编 辑 状 态 即 可最 后 编 译 运 行 程 序 , 观 察 现 象 练 习 : 控 制 LCDNumber显 示 通 过 slider(滑 块 )和 dial(旋 钮 )控 制 LCDNumber上 显 示 的 数 字 Qt Creator编 译 的 程 序 , 在 其 工 程 文 件 夹 下 会 有 一 个 debug文 件 夹 ,其 中 有 程 序 的 .exe可 执 行 文 件 。 但 Qt Creator默 认 是 用 动 态 链 接 的 ,就 是 可 执 行 程 序 在 运 行 时 需 要 相 应 的 .dll文 件 。 我 们 点 击 生 成 的 .exe文 件 , 首 先 可 能 显 示 “ 没 有 找 到 mingwm10.dll, 因 此 这 个 应 用 程 序未 能 启 动 。 重 新 安 装 应 用 程 序 可 能 会 修 复 此 问 题 。 ”表 示 缺 少mingwm10.dll文 件 。 解 决 这 个 问 题 我 们 可 以 将 相 应 的 .dll文 件 放 到 系 统 中 。 在 Qt Creator的 安 装 目 录 的 qt文 件 下 的 bin文 件 夹 下 ( 比 如 安 装 在 了 D盘 ,所 以 路 径 是 D:Qt2009.04qtbin) , 可 以 找 到 所 有 的 相 关 .dll文 件 。方 法 一 : 在 这 里 找 到 mingwm10.dll文 件 , 将 其 复 制 到C:WINDOWSsystem文 件 夹 下 即 可 。 下 面 再 提 示 缺 少 什 么 dll文 件 ,都 像 这 样 解 决 就 可 以 了 。 方 法 二 : 将 这 些 dll文 件 都 与 .exe文 件 放 到 同 一 个 文 件 夹 下 。 不 过这 样 每 个 .exe文 件 都 要 放 一 次 。方 法 三 : 将 D:Qt2009.04qtbin加 入 系 统 Path环 境 变 量 。 右 击我 的 电 脑 -属 性 -高 级 -环 境 变 量 -在 系 统 变 量 列 表 中 找 到 Path,将 路 径 加 入 其 中 即 可 。 用 纯 源 码 编 写 :1.新 建 空 的 Qt工 程 。 2.工 程 名 为 hello world, 并 选 择 工 程 保 存 路 径 3.在 新 建 好 的 工 程 中 添 加 文 件 。 右 击 工 程 文 件 夹 , 弹 出 的 菜 单 中 选择 Add New。 4.选 择 普 通 文 件 。 点 击 Ok 5.文 件 名 为 main.cpp, 点 击 Next进 入 下 一 步 。 6.这 里 自 动 将 这 个 文 件 添 加 到 了 新 建 的 工 程 中 。 保 持 默 认 设 置 , 点击 完 成 。 7.在 main.cpp文 件 中 添 加 代 码 。 8.这 时 点 击 运 行 , 程 序 执 行 了 , 但 看 不 到 效 果 , 因 为 程 序 里 什 么 也没 做 。 我 们 点 击 信 息 框 右 上 角 的 红 色 方 块 , 停 止 程 序 运 行 。 9.我 们 再 更 改 代 码 。 添 加 一 个 对 话 框 对 象 。 10.运 行 效 果 如 下 。 11.我 们 更 改 代 码 如 下 , 在 对 话 框 上 添 加 一 个 标 签 对 象 , 并 显 示hello world。 12.运 行 效 果 如 下 。 二 、 Qt Creator编 写 多 窗 口 程 序实 现 功 能 : 程 序 开 始 出 现 一 个 对 话 框 , 按 下 按 钮 后 便 能 进 入 主 窗 口 ,如 果 直 接 关 闭 这 个 对 话 框 , 便 不 能 进 入 主 窗 口 , 整 个 程 序 也 将 退 出 。当 进 入 主 窗 口 后 , 我 们 按 下 按 钮 , 会 弹 出 一 个 对 话 框 , 无 论 如 何 关闭 这 个 对 话 框 , 都 会 回 到 主 窗 口 。实 现 原 理 : 程 序 里 我 们 先 建 立 一 个 主 工 程 , 作 为 主 界 面 , 然 后 再 建 立一 个 对 话 框 类 , 将 其 加 入 工 程 中 , 然 后 在 程 序 中 调 用 自 己 新 建 的 对话 框 类 来 实 现 多 窗 口 。 实 现 过 程 :1.首 先 新 建 Qt4 Gui Application工 程 , 工 程 名 为 nGui, Base class选 为 QWidget。 建 立 好 后 工 程 文 件 列 表 如 下 图 。 2.新 建 对 话 框 类 , 如 下 图 , 在 新 建 中 , 选 择 Qt Designer Form Class。 3.选 择 Dialog without Buttons。 4.类 名 设 为 myDlg。 5.点 击 Finish完 成 。 注 意 这 里 已 经 默 认 将 其 加 入 到 了 我 们 刚 建 的 工程 中 了 。 6.如 下 图 , 在 mydlg.ui中 拖 入 一 个 Push Button, 将 其 上 的 文 本 改为 “ 进 入 主 窗 口 ” , 在 其 属 性 窗 口 中 将 其 objectName改 为enterBtn(Push Button名 字 ), 在 下 面 的 Signals and slots editor中 进 行 信 号 和 槽 的 关 联 , 其 中 , Sender设 为 enterBtn,Signal设 为 clicked(), Receive设 为 myDlg, Slot设 为 accept()。这 样 就 实 现 了 单 击 这 个 按 钮 使 这 个 对 话 框 关 闭 并 发 出 Accepted信 号的 功 能 。 下 面 我 们 将 利 用 这 个 信 号 。 7.修 改 主 函 数 main.cpp, 如 下 :#include #include “widget.h”#include “mydlg.h” /加 入 头 文 件int main(int argc, char *argv) QApplication a(argc, argv); Widget w; myDlg my1; /建 立 自 己 新 建 的 类 的 对 象 my1 if(my1.exec()=QDialog:Accepted) /利 用 Accepted信 号 判 断enterBtn是 否 被 按 下 w.show(); /如 果 被 按 下 , 显 示 主 窗 口 return a.exec(); /程 序 一 直 执 行 , 直 到 主 窗 口 关 闭 else return 0; /如 果 没 被 按 下 , 则 不 会 进 入 主 窗 口 , 整 个 程 序结 束 运 行主 函 数 必 须 这 么 写 , 才 能 完 成 所 要 的 功 能 。 到 这 里 , 我 们 就 实 现 了 一 个 界 面 结 束 执 行 , 然 后 弹 出 另 一 个 界 面 的程 序 。 下 面 我 们 在 主 窗 口 上 加 一 个 按 钮 , 按 下 该 按 钮 , 弹 出 一 个 对话 框 , 但 这 个 对 话 框 关 闭 , 不 会 使 主 窗 口 关 闭 。8.如 下 图 , 在 主 窗 口 加 入 按 钮 , 显 示 文 本 为 “ 弹 出 一 个 对 话 框 ” ,在 其 上 点 击 鼠 标 右 键 , 在 弹 出 的 菜 单 中 选 择 go to slot。 9.我 们 选 择 单 击 事 件 clicked()。 10.我 们 在 弹 出 的 槽 函 数 中 添 加 一 句 : my2.show(); my2为 我 们 新 建 对 话 框 类 的 另 一 个 对 象 , 但 是 my2我 们 还 没 有 定 义 ,所 以 在 widget.h文 件 中 添 加 相 应 代 码 , 如 下 , 先 加 入 头 文 件 , 再 加入 my2的 定 义 语 句 , 这 里 我 们 将 其 放 到 private里 , 因 为 一 般 的 函 数都 放 在 public里 , 而 变 量 都 放 在 private里 。 #ifndef WIDGET_H#define WIDGET_H#include #include “mydlg.h” /包 含 头 文 件namespace Uiclass Widget;class Widget : public QWidgetQ_OBJECTpublic:Widget(QWidget *parent = 0);Widget();private: Ui:Widget *ui;myDlg my2; /对 my2进 行 定 义private slots:void on_pushButton_clicked();#endif / WIDGET_H 到 这 里 , 再 运 行 程 序 , 便 能 完 成 我 们 实 验 要 求 的 功 能 了 。 整 个 程 序里 , 我 们 用 两 种 方 法 实 现 了 信 号 和 槽 函 数 的 关 联 , 第 一 个 按 钮 我 们直 接 在 设 计 器 中 实 现 其 关 联 ; 第 二 个 按 钮 我 们 自 己 写 了 槽 函 数 语 句 ,其 实 图 形 的 设 计 与 直 接 写 代 码 效 果 是 一 样 的 。 三 、 Qt Creator登 录 对 话 框实 现 功 能 :在 弹 出 对 话 框 中 填 写 用 户 名 和 密 码 , 按 下 登 录 按 钮 , 如 果 用 户 名 和密 码 均 正 确 则 进 入 主 窗 口 , 如 果 有 错 则 弹 出 警 告 对 话 框 。实 现 原 理 :通 过 上 节 的 多 窗 口 原 理 实 现 由 登 录 对 话 框 进 入 主 窗 口 , 而 用 户 名 和密 码 可 以 用 if语 句 进 行 判 断 。 实 现 过 程 :1.先 新 建 Qt4 Gui Application工 程 , 工 程 名 为 mainWidget, 选 用QWidget作 为 Base class, 这 样 便 建 立 了 主 窗 口 。 文 件 列 表 如 下 : 2.然 后 新 建 一 个 Qt Designer Form Class类 , 类 名 为 loginDlg, 选用 Dialog without Buttons, 将 其 加 入 上 面 的 工 程 中 。 文 件 列 表 如下 : 3.在 logindlg.ui中 设 计 下 面 的 界 面 : 行 输 入 框 为 Line Edit。 其 中用 户 名 后 面 的 输 入 框 在 属 性 中 设 置 其 object Name为 usrLineEdit,密 码 后 面 的 输 入 框 为 pwdLineEdit, 登 录 按 钮 为 loginBtn, 退 出 按钮 为 exitBtn。 4.将 exitBtn的 单 击 后 效 果 设 为 退 出 程 序 , 关 联 如 下 : 5.右 击 登 录 按 钮 选 择 go to slot, 再 选 择 clicked(),然 后 进 入 其 单 击 事件 的 槽 函 数 , 写 入 一 句 void loginDlg:on_loginBtn_clicked() accept(); 6.改 写 main.cpp:#include #include “widget.h”#include “logindlg.h”int main(int argc, char *argv) QApplication a(argc, argv); Widget w; loginDlg login; if(login.exec()=QDialog:Accepted) w.show(); return a.exec(); else return 0; 7.这 时 执 行 程 序 , 可 实 现 按 下 登 录 按 钮 进 入 主 窗 口 , 按 下 退 出 按 钮 退 出 程 序 。8.添 加 用 户 名 密 码 判 断 功 能 。 将 登 陆 按 钮 的 槽 函 数 改 为 :void loginDlg:on_loginBtn_clicked()if (ui-usrLineEdit-text()=tr(“qt”)elseQMessageBox:warning(this,tr(“Warning”),tr(“user name or password error!”),QMessageBox:Yes);/如 果 不 正 确 , 弹 出 警 告 对 话 框并 在 logindlg.cpp中 加 入 #include 的 头 文 件 。 如 果不 加 这 个 头 文 件 , QMessageBox类 不 可 用 。 9.这 时 再 执 行 程 序 , 输 入 用 户 名 为 qt, 密 码 为 123456, 按 登 录 按 钮便 能 进 入 主 窗 口 了 , 如 果 输 入 错 了 , 就 会 弹 出 警 告 对 话 框 。 如 果 输 入 错 误 , 便 会 弹 出 警 告 提 示 框 : 10.在 logindlg.cpp的 loginDlg类 构 造 函 数 里 , 添 上 初 始 化 语 句 , 使 密码 显 示 为 小 黑 点 。loginDlg:loginDlg(QWidget *parent) :QDialog(parent),ui(new Ui:loginDlg)ui-setupUi(this);ui- pwdLineEdit- setEchoMode(QLineEdit:Password); 效 果 如 下 : 11.如 果 输 入 如 下 图 中 的 用 户 名 , 在 用 户 名 前 不 小 心 加 上 了 一 些 空 格 ,结 果 程 序 按 错 误 的 用 户 名 对 待 了 。 我 们 可 以 更 改 if判 断 语 句 , 使 这 样 的 输 入 也 算 正 确 。void loginDlg:on_loginBtn_clicked()if(ui-usrLineEdit-text().trimmed()=tr(“ qt” )elseQMessageBox:warning(this,tr(“ Warning” ),tr(“ user name or password error!” ),QMessageBox:Yes);加 入 的 这 个 函 数 的 作 用 就 是 移 除 字 符 串 开 头 和 结 尾 的 空 白 字 符 。 12.最 后 , 如 果 输 入 错 误 了 , 重 新 回 到 登 录 对 话 框 时 , 我 们 希 望 可以 使 用 户 名 和 密 码 框 清 空 并 且 光 标 自 动 跳 转 到 用 户 名 输 入 框 , 最 终的 登 录 按 钮 的 单 击 事 件 的 槽 函 数 如 下 :void loginDlg:on_loginBtn_clicked()if(ui-usrLineEdit-text().trimmed()=tr(“qt”)elseQMessageBox:warning(this,tr(“Warning”),tr(“user name or password error!”),QMessageBox:Yes);/如 果 不 正 确 , 弹 出 警 告 对 话 框ui-usrLineEdit-clear();/清 空 用 户 名 输 入 框 ui-pwdLineEdit-clear();/清 空 密 码 输 入 框ui-usrLineEdit-setFocus();/将 光 标 转 到 用 户 名 输 入 框 最 终 的 loginDlg.cpp文 件 如 下 图 : 四 、 Qt Creator添 加 菜 单 图 标1.新 建 Qt4 Gui Application工 程 , 将 工 程 命 名 为 MainWindow, 其 他选 项 默 认 即 可 。生 成 的 窗 口 界 面 如 下 图 。 其 中 最 上 面 的 为 菜 单 栏 。 2.我 们 在 Type Here那 里 双 击 , 并 输 入 “ 文 件 (这 样 在 程 序 中 使 用 中 文 , 便 能 在 运 行 时 显 示 出 来 了 。 更 改 后 文 件 如下 图 。 2.在 mainwindow.h文 件 中 的 private下 加 入 以 下 语 句 。 bool isSaved; /为 true时 标 志 文 件 已 经 保 存 , 为 false时 标 志 文 件 尚未 保 存 QString curFile; /保 存 当 前 文 件 的 文 件 名 void do_file_New(); /新 建 文 件 void do_file_SaveOrNot(); /修 改 过 的 文 件 是 否 保 存 void do_file_Save(); /保 存 文 件 void do_file_SaveAs(); /文 件 另 存 为 bool saveFile(const QString /存 储 文 件 这 些 是 变 量 和 函 数 的 声 明 。 其 中 isSaved变 量 起 到 标 志 的 作 用 , 用它 来 标 志 文 件 是 否 被 保 存 过 。 然 后 我 们 再 在 相 应 的 源 文 件 里 进 行 这些 函 数 的 定 义 。 3.在 mainwindow.cpp中 先 加 入 头 文 件 #include , 然 后 在 构 造 函数 里 添 加 以 下 几 行 代 码 。 isSaved = false; /初 始 化 文 件 为 未 保 存 过 状 态 curFile = tr(“ 未 命 名 .txt” ); /初 始 化 文 件 名 为 “ 未 命 名 .txt” setWindowTitle(curFile); /初 始 化 主 窗 口 的 标 题 这 是 对 主 窗 口 进 行 初 始 化 。 效 果 如 下 。 4.然 后 添 加 “ 新 建 ” 操 作 的 函 数 定 义 。 void MainWindow:do_file_New() /实 现 新 建 文 件 的 功 能 do_file_SaveOrNot(); isSaved = false; curFile = tr(“未 命 名 .txt”); setWindowTitle(curFile); ui-textEdit-clear(); /清 空 文 本 编 辑 器 ui-textEdit-setVisible(true); /文 本 编 辑 器 可 见 新 建 文 件 , 先 要 判 断 正 在 编 辑 的 文 件 是 否 需 要 保 存 。 然 后 将 新 建 的文 件 标 志 为 未 保 存 过 状 态 。 5.再 添 加 do_file_SaveOrNot函 数 的 定 义 。 void MainWindow:do_file_SaveOrNot() /弹 出 是 否 保 存 文 件 对 话 框 if(ui-textEdit-document()-isModified() /如 果 文 件 被 更 改 过 , 弹 出 保 存 对 话 框 QMessageBox box;box.setWindowTitle(tr(“ 警 告 ” );box.setIcon(QMessageBox:Warning);box.setText(curFile + tr(” 尚 未 保 存 , 是 否 保 存 ? ” );box.setStandardButtons(QMessageBox:Yes | QMessageBox:No);if(box.exec() = QMessageBox:Yes) /如 果 选 择 保 存 文 件 , 则 执 行 保 存 操 作 do_file_Save(); 这 个 函 数 实 现 弹 出 一 个 对 话 框 , 询 问 是 否 保 存 正 在 编 辑 的 文 件 。 6.再 添 加 “ 保 存 ” 操 作 的 函 数 定 义 。 void MainWindow:do_file_Save() /保 存 文 件 if(isSaved) /如 果 文 件 已 经 被 保 存 过 , 直 接 保 存 文 件 saveFile(curFile);else do_file_SaveAs(); /如 果 文 件 是 第 一 次 保 存 , 那 么 调 用 另 存 为 对 文 件 进 行 保 存 时 , 先 判 断 其 是 否 已 经 被 保 存 过 , 如 果 没 有 被 保 存过 , 就 要 先 对 其 进 行 另 存 为 操 作 。 7.下 面 是 “ 另 存 为 ” 操 作 的 函 数 定 义 。 void MainWindow:do_file_SaveAs() /文 件 另 存 为 QString fileName = QFileDialog:getSaveFileName(this,tr(“ 另 存为 ” ),curFile); /获 得 文 件 名 if(!fileName.isEmpty() /如 果 文 件 名 不 为 空 , 则 保 存 文 件 内容 saveFile(fileName); 这 里 弹 出 一 个 文 件 对 话 框 , 显 示 文 件 另 存 为 的 路 径 。 8.下 面 是 实 际 文 件 存 储 操 作 的 函 数 定 义 。 bool MainWindow:saveFile(const QString if(!file.open(QFile:WriteOnly | QFile:Text) /以 只 写 方 式 打 开 文 件 , 如 果 打 开 失 败 则 弹 出 提 示 框 并 返 回 QMessageBox:warning(this,tr(“ 保 存 文 件 ” ), tr(“ 无 法 保 存 文 件 %1:n %2 ).arg(fileName).arg(file.errorString(); return false; /%1,%2表 示 后 面 的 两 个 arg参 数 的 值 QTextStream out( /新 建 流 对 象 , 指 向 选 定 的 文 件 out textEdit-toPlainText(); /将 文 本 编 辑 器 里 的 内 容 以 纯 文 本 的 形 式 输 出 到 流 对 象 中 isSaved = true; curFile = QFileInfo(fileName).canonicalFilePath(); /获 得 文 件 的 标 准 路 径 setWindowTitle(curFile); /将 窗 口 名 称 改 为 现 在 窗 口 的 路 径 return true; 这 个 函 数 实 现 将 文 本 文 件 进 行 存 储 。 下 面 我 们 对 其 中 的 一 些 代 码 进行 讲 解 。 QFile file(fileName);一 句 , 定 义 了 一 个 QFile类 的 对 象 file, 其中 filename表 明 这 个 文 件 就 是 我 们 保 存 的 的 文 件 。 然 后 我 们 就 可 以用 file代 替 这 个 文 件 , 来 进 行 一 些 操 作 。 Qt中 文 件 的 操 作 和 C, C+很 相 似 。 对 于 QFile类 对 象 怎 么 使 用 , 我 们 可 以 查 看 帮 助 。点 击 Qt Creator最 左 侧 的 Help, 在 其 中 输 入 QFile, 在 搜 索 到 的 列表 中 选 择 QFile即 可 。 这 时 在 右 侧 会 显 示 出 QFile类 中 所 有 相 关 信 息以 及 他 们 的 用 法 和 说 明 。 我 们 往 下 拉 , 会 发 现 下 面 有 关 于 怎 么 读 取 文 件 的 示 例 代 码 。 再 往 下 便 能 看 到 用 QTextStream类 对 象 , 进 行 字 符 串 输 入 的 例 子 。下 面 也 提 到 了 QFileInfo和 QDir等 相 关 的 类 , 我 们 可 以 点 击 它 们 去看 一 下 具 体 的 使 用 说 明 。 上 面 只 是 做 了 一 个 简 单 的 说 明 。 以 后 我 们 对 自 己 不 明 白 的 类 都 可 以去 帮 助 里 进 行 查 找 , 这 也 许 是 我 们 以 后 要 做 的 最 多 的 一 件 事 了 。 对于 其 中 的 英 文 解 释 , 我 们 最 好 想 办 法 弄 明 白 它 的 大 意 , 其 实 网 上 也有 一 些 中 文 的 翻 译 , 但 最 好 还 是 从 一 开 始 就 尝 试 着 看 英 文 原 版 的 帮助 , 这 样 以 后 才 不 会 对 中 文 翻 译 产 生 依 赖 。 9.双 击 mainwindow.ui文 件 , 在 图 形 界 面 窗 口 下 面 的 Action Editor动 作 编 辑 器 里 , 我 们 右 击 “ 新 建 ” 菜 单 一 条 , 选 择 Go to slot, 然后 选 择 triggered( ) , 进 入 其 触 发 事 件 槽 函 数 。 同 理 , 进 入 其 他 两 个 菜 单 的 槽 函 数 , 将 相 应 的 操 作 的 函 数 写 入 槽 函数 中 。 如 下 。 void MainWindow:on_action_New_triggered() /信 号 和 槽 的 关 联 do_file_New(); void MainWindow:on_action_Save_triggered() do_file_Save(); void MainWindow:on_action_SaveAs_triggered() do_file_SaveAs(); 最 终 的 mainwindow.cpp文 件 如 下 。 最 终 的 mainwindow.h文 件 如 下 。 这 时 点 击 运 行 , 就 能 够 实 现 新 建 文 件 , 保 存 文 件 , 文 件 另 存 为 的 功 能 了 。 实 现 打 开 , 关 闭 , 退 出 , 撤 销 , 复 制 , 剪 切 , 粘 贴 的 功 能 。 先 备 份 上 次 的 工 程 文 件 , 然 后 再 将 其 打 开 。 1.先 在 mainwindow.h文 件 中 加 入 函 数 的 声 明 。 void do_file_Open(); /打 开 文 件 bool do_file_Load(const QString /读 取 文 件 2.再 在 mainwindow.cpp文 件 中 写 函 数 的 功 能 实 现 。 void MainWindow:do_file_Open()/打 开 文 件 do_file_SaveOrNot();/是 否 需 要 保 存 现 有 文 件 QString fileName = QFileDialog:getOpenFileName(this); /获 得 要 打 开 的 文 件 的 名 字 if(!fileName.isEmpty()/如 果 文 件 名 不 为 空 do_file_Load(fileName); ui-textEdit-setVisible(true);/文 本 编 辑 器 可 见 bool MainWindow:do_file_Load(const QString if(!file.open(QFile:ReadOnly | QFile:Text) QMessageBox:warning(this,tr(“ 读 取 文 件 ” ),tr(“ 无 法 读 取 文 件 %1:n%2.” ).arg(fileName).arg(file.errorString(); return false; /如 果 打 开 文 件 失 败 , 弹 出 对 话 框 , 并 返 回 QTextStream in( ui-textEdit-setText(in.readAll(); /将 文 件 中 的 所 有 内 容 都 写 到 文 本 编 辑 器 中 curFile = QFileInfo(fileName).canonicalFilePath(); setWindowTitle(curFile); return true; 上 面 的 打 开 文 件 函 数 与 文 件 另 存 为 函 数 相 似 , 读 取 文 件 的 函 数 与文 件 存 储 函 数 相 似 。 3.然 后 按 顺 序 加 入 更 菜 单 的 关 联 函 数 , 如 下 。 void MainWindow:on_action_Open_triggered() /打 开 操 作 do_file_Open(); / void MainWindow:on_action_Close_triggered() /关 闭 操 作 do_file_SaveOrNot(); ui-textEdit-setVisible(false); / void MainWindow:on_action_Quit_triggered() /退 出 操 作 on_action_Close_triggered(); /先 执 行 关 闭 操 作 qApp-quit(); /再 退 出 系 统 , qApp是 指 向 应 用 程 序 的 全 局 指 针 / void MainWindow:on_action_Undo_triggered() /撤 销 操 作 ui-textEdit-undo(); / void MainWindow:on_action_Cut_triggered() /剪 切 操 作 ui-textEdit-cut(); / void MainWindow:on_action_Copy_triggered() /复 制 操 作 ui-textEdit-copy(); / void MainWindow:on_action_Past_triggered() /粘 贴 操 作 ui-textEdit-paste(); 因 为 复 制 , 撤 销 , 全 选 , 粘 贴 , 剪 切 等 功 能 , 是 TextEdit默 认就 有 的 , 所 以 我 们 只 需 调 用 一 下 相 应 函 数 就 行 。 到 这 里 , 除 了查 找 和 帮 助 两 个 菜 单 的 功 能 没 有 加 上 以 外 , 其 他 功 能 都 已 经 实现 了 。 七 、 Qt Creator实 现 文 本 查 找以 前 都 用 设 计 器 设 计 界 面 , 而 这 次 我 们 用 代 码 实 现 一 个 简 单 的 查 找对 话 框 。 对 于 怎 么 实 现 查 找 功 能 的 , 我 们 详 细 地 分 步 说 明 了 怎 么 进行 类 中 方 法 的 查 找 和 使 用 。 其 中 也 将 Qt Creator智 能 化 的 代 码 补 全功 能 和 程 序 中 函 数 的 声 明 位 置 和 定 义 位 置 间 的 快 速 切 换 进 行 了 介 绍 。1.首 先 还 是 保 存 以 前 的 工 程 , 然 后 再 将 其 打 开 。我 们 发 现 Qt Creator默 认 的 字 体 有 点 小 , 可 以 按 下 Ctrl键 的 同 时 按 两下 +键 , 来 放 大 字 体 。 也 可 以 选 择 Edit-Advanced-Increase Font Size。 2.在 mainwindow.h中 加 入 #include 的 头 文 件 包 含 , 在private中 添 加QLineEdit *find_textLineEdit; /声 明 一 个 行 编 辑 器 , 用 于 输 入要 查 找 的 内 容在 private slots中 添 加void show_findText();在 该 函 数 中 实 现 查 找 字 符 串 的 功 能 。 3.我 们 进 入 查 找 菜 单 的 触 发 事 件 槽 函 数 , 更 改 如 下 。void MainWindow:on_action_Find_triggered()QDialog *findDlg = new QDialog(this);/新 建 一 个 对 话 框 , 用 于 查 找 操 作 , this表 明 它 的 父 窗 口 是 MainWindow。findDlg-setWindowTitle(tr(“ 查 找 ” );/设 置 对 话 框 的 标 题find_textLineEdit = new QLineEdit(findDlg);/将 行 编 辑 器 加 入 到 新 建 的 查 找 对 话 框 中QPushButton *find_Btn = new QPushButton(tr(“ 查 找 下 一 个 ” ),findDlg);/加 入 一 个 “ 查 找 下 一 个 ” 的 按 钮QVBoxLayout* layout = new QVBoxLayout(findDlg);layout-addWidget(find_textLineEdit);layout-addWidget(find_Btn);/新 建 一 个 垂 直 布 局 管 理 器 , 并 将 行 编 辑 器 和 按 钮 加 入 其 中 findDlg -show();/显 示 对 话 框connect(find_Btn,SIGNAL(clicked(),this,SLOT(show_findText();/设 置 “ 查 找 下 一 个 ” 按 钮 的 单 击 事 件 和 其 槽 函 数 的 关 联 4.这 里 我 们 直 接 用 代 码 生 成 了 一 个 对 话 框 , 其 中 一 个 行 编 辑 器 可 以输 入 要 查 找 的 字 符 , 一 个 按 钮 可 以 进 行 查 找 操 作 。 我 们 将 这 两 个 部件 放 到 了 一 个 垂 直 布 局 管 理 器 中 。 然 后 显 示 这 个 对 话 框 。 并 设 置 了那 个 按 钮 单 击 事 件 与 show_findText()函 数 的 关 联 。 5.下 面 我 们 开 始 写 实 现 查 找 功 能 的 show_findText()函 数 。void MainWindow:show_findText()/“ 查 找 下 一 个 ” 按 钮 的 槽 函数QString findText = find_textLineEdit-text();/获 取 行 编 辑 器 中 的 内 容先 用 一 个 QString类 的 对 象 获 得 要 查 找 的 字 符 。 然 后 我 们 一 步 一 步写 查 找 操 作 的 语 句 。 6.在 下 一 行 写 下 ui, 然 后 直 接 按 下 键 盘 上 的 “ ” 或 “ .” , 因 为 ui是 指 针 对象 , 所 以 自 动 生 成 “ -” 号 , 而 且 弹 出 了 ui中 的 所 有 部 件 名 称 的 列表 。 如 下 图 。 7.我 们 用 向 下 的 方 向 键 选 中 列 表 中 的 textEdit。 或 者 我 们 可 以 先 输入 text, 这 时 能 缩 减 列 表 的 内 容 。 8.如 上 图 我 们 将 鼠 标 放 到 textEdit上 , 这 时 便 出 现 了 textEdit的 类名 信 息 , 且 后 面 出 现 一 个 F1按 键 。 我 们 按 下 键 盘 上 的 F1, 便 能 出 现textEdit的 帮 助 。 9.我 们 在 帮 助 中 向 下 拉 , 会 发 现 这 里 有 一 个 find函 数 。 10.我 们 点 击 find, 查 看 其 详 细 说 明 。 11.可 以 看 到 find函 数 可 以 实 现 文 本 编 辑 器 中 字 符 串 的 查 找 。 其 中有 一 个 FindFlags的 参 数 , 我 们 点 击 它 查 看 其 说 明 。 12.可 以 看 到 它 是 一 个 枚 举 变 量 ( enum) , 有 三 个 选 项 , 第 一 项 是向 后 查 找 ( 即 查 找 光 标 以 前 的 内 容 , 这 里 的 前 后 是 相 对 的 说 法 , 比如 第 一 行 已 经 用 完 了 , 光 标 在 第 二 行 时 , 把 第 一 行 叫 做 向 后 。 ) ,第 二 项 是 区 分 大 小 写 查 找 , 第 三 项 是 查 找 全 部 。13.我 们 选 用 第 一 项 , 然 后 写 出 下 面 的 语 句 。ui-textEdit-find(findText,QTextDocument:FindBackward); 当 写 完 函 数 名 和 第 一 个 “ ( ” 后 , 系 统 会 自 动 显 示 出 该 函 数 的 函 数原 型 , 这 样 可 以 使 我 们 减 少 出 错 。 14.这 时 已 经 能 实 现 查 找 的 功 能 了 。 但 是 我 们 刚 才 看 到 find的 返 回值 类 型 是 bool型 , 而 且 , 我 们 也 应 该 为 查 找 不 到 字 符 串 作 出 提 示 。if(!ui-textEdit -find(findText,QTextDocument:FindBackward)QMessageBox:warning(this,tr(“ 查 找 ” ),tr(“ 找 不 到 %1 ).arg(findText);因 为 查 找 失 败 返 回 值 是 false, 所 以 if条 件 加 了 “ ! ” 号 。 在 找 不 到时 弹 出 警 告 对 话 框 。 15.到 这 里 , 查 找 功 能 就 基 本 上 写 完 了 。 show_findText()函 数 的 内容 如 下 。 我 们 会 发 现 随 着 程 序 功 能 的 增 强 , 其 中 的 函 数 也 会 越 来 越 多 , 我 们都 会 为 查 找 某 个 函 数 的 定 义 位 置 感 到 头 疼 。 而 在 Qt Creator中 有 几种 快 速 定 位 函 数 的 方 法 , 我 们 这 里 讲 解 三 种 。第 一 , 在 函 数 声 明 的 地 方 直 接 跳 转 到 函 数 定 义 的 地 方 。如 在 do_file_Load上 点 击 鼠 标 右 键 , 在 弹 出 的 菜 单 中 选 择 Follow Symbol under Cursor或 者 下 面 的 Switch between Method Declaration/Definition。 第 二 , 快 速 查 找 一 个 文 件 里 的 所 有 函 数 。我 们 可 以 点 击 窗 口 最 上 面 的 下 拉 框 , 这 里 会 显 示 本 文 件 中 所 有 函 数的 列 表 。 第 三 , 利 用 查 找 功 能 。1.我 们 先 将 鼠 标 定 位 到 一 个 函 数 名 上 。2.然 后 选 择 Edit-Find/Replace-Find Dialog。3.这 时 会 出 现 一 个 查 找 对 话 框 , 可 以 看 到 要 查 找 的 函 数 名 已 经 写 在里 面 了 。 4.当 我 们 按 下 Search按 钮 后 , 会 在 查 找 结 果 窗 口 显 示 查 找 到 的 结 果 。 5.我 们 点 击 第 二 个 文 件 。 会 发 现 在 这 个 文 件 中 有 两 处 关 键 字 是 高 亮显 示 。 6.我 们 双 击 第 二 项 , 就 会 自 动 跳 转 到 函 数 的 定 义 处 。 八 、 Qt Creator实 现 状 态 栏 显 示1.我 们 在 mainwindow.h中 做 一 下 更 改 。加 入 头 文 件 包 含 : #include 加 入 私 有 变 量 和 函 数 :QLabel* first_statusLabel; /声 明 两 个 标 签 对 象 , 用 于 显 示 状 态 信 息QLabel* second_statusLabel;void init_statusBar(); /初 始 化 状 态 栏加 入 一 个 槽 函 数 声 明 : void do_cursorChanged(); /获 取 光 标 位 置 信息 2.在 mainwindow.cpp中 加 入 状 态 栏 初 始 化 函 数 的 定 义 。void MainWindow:init_statusBar()QStatusBar* bar = ui-statusBar; /获 取 状 态 栏first_statusLabel = new QLabel; /新 建 标 签first_statusLabel-setMinimumSize(150,20); /设 置 标 签 最 小 尺 寸first_statusLabel-setFrameShape(QFrame:WinPanel); /设 置 标 签 形 状first_statusLabel-setFrameShadow(QFrame:Sunken); /设 置 标 签 阴 影seco
展开阅读全文