尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【Qt学习笔记】Qt基础及入门操作功能(二)

【Qt学习笔记】Qt基础及入门操作功能(二) 一. 什么是QtQt 是一个 1991 年由 Qt Company 开发的跨平台 C 图形用户界面应用程序开发框架。它既可以开发 GUI 程序也可用于开发非 GUI 程序比如控制台工具和服务器。Qt 是面向对象的框架使用特殊的代码生成扩展称为元对象编译器 (Meta Object Compiler, moc)以及一些宏Qt 很容易扩展并且允许真正地组件编程。GUI Graphical User Interface图形用户界面1. 类的认识1. 类 一张图纸 / 模板描述一类事物有什么属性变量、能做什么行为函数。类本身不是实体只是定义规格不能直接拿来用。类基础代码模板// 定义一个类图纸classCar{public:intspeed;// 属性速度成员变量voidrun()// 行为行驶成员函数{speed60;}};2. 两种创建对象方式方式1普通对象Car myCar;// 根据Car类造出一个对象 myCarmyCar.speed50;// . 访问成员变量myCar.run();// . 调用成员函数方式2指针对象new的作用在堆内存创建实体对象返回对象地址。Car*pCarnewCar();// pCar是【指向Car对象的指针】pCar-speed80;// - 访问成员变量pCar-run();// - 调用成员函数3. 访问权限 public /privatepublic公开外部代码可以直接用./-访问写 Qt 最常用private私有只能在类内部使用外部无法访问用来保护数据classCar{private:intweight;//私有外面不能直接访问public:intspeed;voidrun(){}};4. 构造函数名字和类名一模一样没有返回值创建对象的时候自动调用用来初始化。classCar{public:Car()//构造函数{speed0;//对象诞生速度初始化为0}intspeed;};5. 在 Qt 里面的真实例子#includeQPushButton// 1.普通对象用 .QPushButton btn;btn.setText(启动);// .调用函数//2.指针对象用 -QPushButton*pBtnnewQPushButton();pBtn-setText(停止);// -调用函数2. Qt高频基础类二. Qt的编译1. Qt的代码框架#includeQApplicationintmain(intargc,char*argv[]){QApplicationapp(argc,argv);returnapp.exec();}2. Qt的基础实现效果#includeQApplication#includeQLabel#includeQLineEdit#includeQPushButton#includeQHBoxLayout#includeQVBoxLayoutintmain(intargc,char*argv[]){// Qt应用程序实例几乎所有Qt桌面程序第一行QApplicationapp(argc,argv);// 创建控件全部new堆对象指针使用 - 访问成员QLabel*infoLabelnewQLabel;QLabel*openLabelnewQLabel;QLineEdit*cmdLineEditnewQLineEdit;QPushButton*commitButtonnewQPushButton;QPushButton*cancelButtonnewQPushButton;QPushButton*browseButtonnewQPushButton;// 设置控件显示文字指针用 -infoLabel-setText(input cmd:);openLabel-setText(open);commitButton-setText(commit);cancelButton-setText(cancel);browseButton-setText(browse);// 水平布局1open标签 输入框QHBoxLayout*cmdLayoutnewQHBoxLayout;cmdLayout-addWidget(openLabel);cmdLayout-addWidget(cmdLineEdit);// 水平布局2三个按钮放在一行QHBoxLayout*buttonLayoutnewQHBoxLayout;buttonLayout-addWidget(commitButton);buttonLayout-addWidget(cancelButton);buttonLayout-addWidget(browseButton);// 垂直总布局从上往下堆叠QVBoxLayout*mainLayoutnewQVBoxLayout;mainLayout-addWidget(infoLabel);// 添加标签控件mainLayout-addLayout(cmdLayout);// 嵌入子水平布局mainLayout-addLayout(buttonLayout);// 嵌入子水平布局// 主窗口控件普通栈对象不是指针用 . 访问成员QWidget w;w.setLayout(mainLayout);// 给窗口设置布局w.show();// 显示窗口// 开启Qt事件循环监听按钮点击等事件窗口保持打开returnapp.exec();}实现效果运行生成的exe文件三. Qt的开发工具-Qtcreater1. 创建项目打开Qtcreater并选择项目类型点击 “文件” 菜单选择 “新建文件或项目”。在弹出的对话框中选择 “Application”应用程序。然后选择 “Qt Widgets Application”点击 “Choose” 按钮。配置项目设置项目名称和路径 输入项目名称并选择保存路径注意路径中不要包含中文。选择构建系统 默认使用 qmake适合简单的 Qt 项目。 如果需要更复杂的功能可以选择 cmake。QWidget所有窗口、按钮、标签的基类是最基础的空白容器QMainWindow继承自 QWidget是一个预制好的、带菜单栏 / 工具栏 / 状态栏的完整主窗口框架。Qmainwindow是主窗口大型软件主界面用只做简单弹窗、小面板 →QWidget不带菜单栏做软件的主界面需要顶部菜单、底部状态栏 →QMainWindow定义主窗口类 设置主窗口类的名称如 MainWindow。 选择父类通常为 QMainWindow 或 QWidget。 勾选生成 .ui 文件以便可视化设计界面。QDialog是 Qt Widgets 模块的对话框基类继承自QWidget用来做弹窗窗口专门用于和用户做简短交互选择语言翻译选择编译器完成创建点击 “完成” 按钮Qt Creator 会自动生成项目文件包括 main.cpp: 主函数文件。 .h/.cpp: 主窗口类的头文件和实现文件。 .ui: 界面设计文件。在 Qt Creator 中点击运行按钮程序会编译并启动显示一个空白窗口。QT core gui 表示引入的模块下部分的文件与左上角文件对应2. 界面介绍Run├─ Run.pro # 项目管理文件qmake├─ Headers头文件 .h│ └─ mainwindow.h # MainWindow类的声明├─ Sources源文件 .cpp│ ├─ main.cpp # 程序入口main函数│ ├─ mainwindow.cpp # MainWindow类的实现代码│ └─ Run_zh_CN.ts # 中文翻译文件├─ FormsUI窗体文件│ └─ mainwindow.ui # 可视化拖拽界面文件└─ Other files├─ debug文件夹 # 编译输出目录exe、中间文件└─ Run_zh_CN.ts # 翻译文件点击mainwindow.ui 进入设计界面3. QT程序启动流程进入 main 函数intmain(intargc,char*argv[]){构造 QApplication 对象QApplicationa(argc,argv);创建主窗口 / 对话框对象执行 MainWindow 构造函数执行父类构造QMainWindow/QDialog/QWidget加载 ui 界面ui-setupUi(this)实例化所有控件、布局执行你写的构造函数内代码初始化变量、定时器、信号槽连接等MainWindow w;也就是执行此部分代码了构造函数MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);//加载ui_mainwindow.h创建界面所有控件// connect绑定信号和槽connect(ui-newAction,QAction::triggered,this,MainWindow::newActionSlot);connect(ui-openAction,QAction::triggered,this,MainWindow::openActionSlot);connect(ui-saveAction,QAction::triggered,this,MainWindow::saveActionSlot);}调用 show () 显示窗口w.show();启动事件循环 exec ()a.exec()启动 Qt 主事件循环阻塞 main 函数代码停在这里returna.exec();}程序退出点击窗口右上角关闭按钮主窗口销毁窗口对象析构执行MainWindow::~MainWindow()delete ui;释放 ui 控件内存事件循环a.exec()结束返回退出码main 函数 returnQApplication a对象析构释放 Qt 底层资源进程结束程序关闭4.通过设计制作简单界面拖入形成界面左上角有小窗口所以是mainwindows点击插件会有比较浅颜色的高亮代表是那个插件。MainWindow整个主窗口本体centralwidget(QWidget)中间放按钮、输入框等内容的核心容器menubar(QMenuBar)窗口顶部菜单栏statusbar(QStatusBar)窗口底部状态栏改变标签的数据QObjectQt 所有对象的最顶层基类提供信号与槽核心能力。QWidget所有界面控件的基类具备窗口显示、鼠标键盘事件能力。QFrame继承 QWidget增加边框、背景面板功能。QLabel继承 QFrame就是标签控件用来展示文字、图片。一般可以直接使用鼠标操作。改变文本的大小排版信息改变字体运行结果四. 信号与槽1.基本介绍信号点击界面插件发出的信号槽对信号的响应又叫槽函数右键信号插件- 转到槽QAbstractButton按钮基类信号触发时机适用场景clicked()鼠标按下 在按钮区域松开一次完整点击普通确认按钮最常用clicked(bool)同clicked()携带布尔参数复选框/单选框bool代表是否选中普通QPushButton一般不用pressed()鼠标按下按钮瞬间不需要松开长按、按住持续发送指令released()鼠标松开按钮时触发哪怕松开时鼠标移出按钮松手才执行逻辑toggled(bool)按钮选中状态发生切换开关类控件复选框、单选框、可勾选按钮QWidget所有界面控件的基类信号触发时机适用场景customContextMenuRequested控件触发右键菜单自定义右键弹出菜单windowIconChanged(QIcon)窗口图标发生改变监听窗口图标更新windowIconTextChanged(QString)窗口图标文字变化极少用windowTitleChanged(QString)窗口标题文字修改监听窗口标题变更QObjectQt所有对象的顶层基类信号触发时机适用场景destroyed()对象被销毁、释放内存时触发无参资源清理简单场景destroyed(QObject*)对象销毁携带对象指针参数多对象管理知道是哪个对象被释放objectNameChanged(QString)对象的objectName名称被修改监听对象名称变化调试居多QAbstractButton按钮相关事件QWidget窗口/控件通用界面事件QObjectQt对象生命周期、属性底层事件偏底层普通上位机界面开发很少用到2. 工作流程点击clicked()后跳入如下界面增加了头文件中的click函数以及cpp源文件中的具体函数实现。自动信号槽绑定不需要手动写connect()::用来标明这个函数 / 变量属于哪一个类、命名空间区分 “归属”// 返回值 类名::函数名voidMainWindow::on_pushButton_clicked()2. Qprocess:在Qt程序里启动外部程序/系统命令。3. start启动一个外部进程命令/程序3. 实现示例通过调用cmd.exe打开文件// 确认按钮点击触发的槽函数Qt自动信号关联voidMainWindow::on_pushButton_clicked(){// 读取UI界面中cmdLineEdit输入框里用户输入的命令文本QString cmdTextui-cmdLineEdit-text();// 创建QProcess进程对象父对象设置为当前窗口this// 窗口销毁时自动回收该对象避免内存泄漏QProcess*myProcessnewQProcess(this);// 启动cmd.exe程序通过cmd执行用户输入的命令Windows专用// 参数 /c : 执行完后面的命令后自动关闭cmd窗口myProcess-start(cmd.exe,QStringList()/ccmdText);}实现回车执行的功能MainWindow 的构造函数写在.cpp文件里面作用是创建窗口对象的时候自动执行这一段代码用来初始化窗口和界面。connect函数用来绑定信号发送者 和 槽函数。// MainWindow主窗口的构造函数窗口创建时自动执行MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)// 调用父类QMainWindow的构造函数设置父窗口,ui(newUi::MainWindow)// 创建ui界面对象用来管理ui文件里所有控件{// 根据ui文件实例化界面创建窗口上所有控件输入框、按钮等ui-setupUi(this);// 信号槽绑定输入框按下回车键时触发确认按钮的点击槽函数// 参数说明发送者(输入框)信号(回车按下)接收者(当前主窗口)槽函数(按钮点击函数)connect(ui-cmdLineEdit,SIGNAL(returnPressed()),this,SLOT(on_pushButton_clicked()));}取消函数voidMainWindow::on_pushButton_2_clicked(){this-close();}浏览小窗口函数// 绑定浏览按钮的点击信号使用Lambda匿名函数作为槽connect(ui-browseButton,QPushButton::clicked,[this](){// 弹出信息提示框// 参数父窗口弹窗标题弹窗内容QMessageBox::information(this,信息,点击浏览);});4. 总结1. 使用【自定义成员函数作为槽】的分步在 mainwindow.h 中声明槽函数privateslots:voidon_BrowseClicked();在 mainwindow.cpp 实现这个函数voidMainWindow::on_BrowseClicked(){QMessageBox::information(this,提示,点击浏览);}2. 使用 connect【自定义成员函数作为槽】完整步骤头文件mainwindow.h准备privateslots:voidonBrowseClicked();源文件mainwindow.cppvoidMainWindow::onBrowseClicked(){QMessageBox::information(this,提示,点击浏览);}在构造函数中写 connectMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);// 先创建所有UI控件// connect绑定发送对象信号接收对象槽函数connect(ui-browseButton,QPushButton::clicked,this,MainWindow::onBrowseClicked);}区别就是右键 UI 转到槽Qt 根据函数名自动匹配setupUi 内部隐式完成 connect无需手动写 connect函数名必须遵守on_控件名_信号名命名规则。
返回列表