当前位置: 首页 > news >正文

深圳网站设计工作室百度快照推广是什么意思

深圳网站设计工作室,百度快照推广是什么意思,成都网站定制建设,江苏省住房和建设厅网站目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 #x1f407; 图形化界面实现 #x1f407; 纯代码形式实现 1.2 使用 按钮 实现 #x1f40b; 图形化界面实现 #x1f40b; 纯代码形式实现 1.3 使用 编辑框 实现 #x1f95d; 图形化界面实现 #x1f95…目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现   图形化界面实现 纯代码形式实现 1.2 使用 按钮 实现  图形化界面实现  纯代码形式实现 1.3 使用 编辑框 实现 图形化界面实现 纯代码形式实现  2. 认识对象模型对象树 2.1 什么是对象树 2.2 验证对象树 3. 解决编码问题 4. Qt 编程注意事项 4.1 Qt 中的命名事项 4.2 Qt Creator 中的快捷键 4.3 使用帮助文档 5. 补充 -- 析构函数执行顺序 6. 小结 1. 编写第一个 QT 程序 1.1 使用 标签 实现   图形化界面实现 ①  创建好一个项目后我们可以点击 widget.ui 进入图形化界面设计可以直接通过拖拽的方式进行添加 ② 拖拽 标签 至 UI 设计界面中并双击修改标签内容 此时ui界面就会生成对应的 XML 格式代码这个时候qmake就会根据这个XML代码生成对应的C代码我们也可以在同目录下找到这个C代码 纯代码形式实现 我们点击 widget.cpp 里面会有一个 widget 的构造函数和析构函数我们一般使用代码进行编辑界面的时候一般都是在 widget 的构造函数中实现因为在  main 函数中调用了 widget 类之后就直接 show了所以卸载构造函数中的时候一旦执行到了 show 就一定可以显示出设计的界面 #include widget.h // 创建生成时的文件 #include ui_widget.h #include QLabel // 包含标签的头文件Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this); // 将form file生成的界面和我们当前的widget进行关联起来// 创建对象的两种方法// QLabel label; // 在栈上创建QLabel* label new QLabel(this); // 在堆上创建推荐这种方法还要传递 一个 this给当前这个 lable 对象指定 父对象// 1. 设置标签内容label-setText((QString)(显式 Hello world));label-setText(隐式 Hello World); // QString 也提供了 C 风格字符串作为参数的构造函数来不显示构造 QString// 注意由于QString 对应的头文件,已经被很多 Qt 内置的其他类给间接包含了.因此一般不需要显式包含 QString 头文件// 这里虽然有两次 setText但是下面内容会覆盖上面内容// 2. 设置窗口大小setFixedSize(500, 400);// 3. 设置字体大小QFont font(楷体, 16);label-setFont(font);// 4. 设置标签内容显式位置label-move(200, 150);// 5. 设计标签字体颜色label-setStyleSheet(color:blue); }Widget::~Widget() {delete ui; } void setText(const QString );这里我们会发下使用字符串的时候并不是我们 C 使用的标准库中的 string而是 Qt 自己包装好的字符串 QString 。这个其实也是历史原因Qt 诞生于1991年那个时候 C 还没有定标准而 Qt 为了更好的开发就自己包装了一些容器。但是我们也还是可以使用 C 的标准库中的容器来使用 QString 用起来其实也要比 std::string 好一点因为 QString 内部已经对于字符编码做了处理而不像 std::string 啥都没做 1.2 使用 按钮 实现  图形化界面实现  ① 双击widget.ui 文件 ② 拖拽控件至 ui 界面窗口并修改内容 虽然那里有好几个按钮但是我们这里用 Push Button普通按钮 ② 构建并运行效果如下所示 这里的按钮的确可以点击但是却没有任何反应这个就设计到我们后面学的信号槽知识后面会说的 QT 的信号槽机制本质上就是给按钮的点击操作关联上一个处理函数当用户点击的时候就会执行这个处理函数 这里我们的按钮没有任何功能假如我们要实现一定的功能那该怎么做呢 打开 widget.ui 文件查看设计的右下角则有 如下代码 #include widget.h #include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this);// 按钮的点击操作 -- 信号槽// 在 Linux 网络编程那也有个connect 函数那里用来给 TCP socket 建立连接的写 TCP 客户端的时候就需要先建立连接才能读写数据// ui-pushButton谁发出的信号// QPushButton::clicked发出了啥信号点击按钮的时候自动触发该信号// this 谁来处理这个信号// Widget::handle具体怎么处理connect(ui-pushButton, QPushButton::clicked, this, Widget::handleClick); // 访问到 form fileui 文件中创建的控件}Widget::~Widget() {delete ui; }void Widget::handleClick() {if(ui-pushButton-text() Hello World){ui-pushButton-setText(Hello IsLand);}else{ui-pushButton-setText(Hello World);} } 返回上级目录查看 ui_widget.h 文件 因此我们也可以把 PushButton 改成其他的如下 再次查看 ui_widget.h 文件如下 结论在 objectName 中设置成什么值生成的变量名就叫啥名字就可以根据这个名字来获取到对应的控件的变量了 纯代码形式实现 widget.h #ifndef WIDGET_H #define WIDGET_H#include QWidget #include QPushButtonQT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);void handleClick();~Widget();private:Ui::Widget *ui;QPushButton* myButton; }; #endif // WIDGET_Hwidget.cpp #include widget.h #include ui_widget.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this);myButton new QPushButton(this);myButton-setText(Hello World);connect(myButton, QPushButton::clicked, this, Widget::handleClick); // 访问到 form fileui 文件中创建的控件 }Widget::~Widget() {delete ui; }void Widget::handleClick() {if(myButton-text() QString(Hello World)){myButton-setText(Hello IsLand);}else{myButton-setText(Hello World);} }实现效果如下图 两个版本比较 图形化实现此时按钮对象不需要咱们自己 new。new 对象的操作已经是被 Qt 自动生成了而且这个按钮对象已经作为 ui 对象里的一个成员变量了也无需作为 Widget 的成员纯代码实现按钮对象是咱们自己 new 的为了保证其他函数中能够访问到这个变量就需要把按钮对象设定为 Widget 类的成员变量 实际开发中是通过代码的方式构造界面为主还是通过图形化界面的方式构造界面为主?? 这两种都很主要难分主次!!如果你当前程序界面界面内容是比较固定的此时就会以 图形化 的方式来构造界面但是如果你的程序界面经常要动态变化此时就会以 代码 的方式来构造界面反正这两种方式哪种方便用哪个也可以配合来使用 1.3 使用 编辑框 实现 单行编辑框 QLineEdit多行编辑框 QTextEdit 图形化界面实现 当然输出的文本框我们也可以在输出里面进行修改啥的但是不会影响代码里面的文本数据 纯代码形式实现  内存泄露  在上面的代码实现中我们使用 new 创建了对象在栈上开辟了一块空间之后但是我们没有使用delete进行释放控件这样不就会导致内存泄漏啊 其实上述代码在 Qt 不会产生内存泄露 label  对象会在合适的时候被析构释放之所以能够把对象释放掉主要是因为把这个对象挂到了 对象树 上 前端开发(网页开发)也涉及到 类似的 对象树 (DOM)本质上也是一个树形结构(N 又树),通过树形结构把界面上的各种元素组织起来Qt 中也是类似,也是搞了一个对象树也是 N 又树,把界面上的各种元素组织起来了 用对象树把这些内容组织起来最主要的目的就是为了能够在合适的时机窗口关闭和销毁把这些对象统一进行释放。通过这个树形结构就把界面上要显示的这些控件对象都组织起来了。这里的树上的这些对象统一销毁是最好不过的如果某个对象提前销毁此时就会导致对应的控件就在界面上不存在了。 2. 认识对象模型对象树 2.1 什么是对象树 在 Qt 中创建很多对象的时候会提供一个 Parent对象指针下面来解释这个 parent 到底是干什么的。 QObject  是以对象树的形式组织起来的。 当创建一个 QObject 对象时会看到 QObject 的构造函数接收一个 QObject 指针作为参数这个参数就是 parent也就是父对象指针。这相当于在创建 QObject 对象时可以提供一个其父对象我们创建的这个 QObject 对象会自动添加到其父对象的 children()列表。当父对象析构的时候这个列表中的所有对象也会被析构。(注意这里的父对象并不是继承意义上的父类!) 这种机制在 GUI程序设计中相当有用。例如一个按钮有一个 QShortcut快捷键对象作为其子对象。当删除按钮的时候这个快捷键理应被删除。这是合理的。 Qwidget 是能够在屏幕上显示的一切组件的父类。 Qwidget 继承自 QObject因此也继承了这种对象树关系。一个孩子自动地成为父组件的-个子组件。因此它会显示在父组件的坐标系统中被父组件的边界剪裁。例如当用户关闭一个对话框的时候应用程序将其删除那么我们希望属于这个对话框的按钮、图标等应该(-起被删除。事实就是如此因为这些都是对话框的子组件。当然我们也可以自己删除子对象它们会自动从其父对象列表中删除。比如当我们删除了个工具栏时其所在的主窗口会自动将该工具栏从其子对象列表中删除并且自动调整屏幕显示。 Qt 引入对象树的概念在一定程度上解决了内存问题。 当一个 QObject 对象在堆上创建的时候Qt 会同时为其创建一个对象树。不过对象树中对象的顺序是没有定义的。这意味着销毁这些对象的顺序也是未定义的。任何对象树中的 QObject 对象 delete 的时候如果这个对象有 parent则自动将其从 parent的children() 列表中删除如果有孩子则自动 delete 每一个孩子。Qt 保证没有 QObject 会被delete 两次这是由析构顺序决定的。 如果 QObject 在栈上创建Qt 保持同样的行为。正常情况下这也不会发生什么问题。来看下面的代码片段: {QWidget window;QLabel label(hello, window); // 指定父类是widow }作为父组件的  window 和作为子组件的  quit 都是 QObject 的子类(事实上它们都是 Qwidget的子类而 Qwidget 是 QObject 的子类)。这段代码是正确的quit 的析构函数不会被调用两次因为标准 C 要求局部对象的析构顺序应该按照其创建顺序的相反过程。因此这段代码在超出作用域时会先调用 quit 的析构函数将其从父对象 window 的子对象列表中删除然后才会再调用  window 的析构函数。 但是一旦我们的代码稍微修改一点就会出错 {QLabel label(hello); // 指定父类是widowQWidget window;label.setParent(window); }情况又有所不同析构顺序就有了问题。我们看到在上面的代码中作为父对象的 window 会首先被析构因为它是最后一个创建的对象。在析构过程中它会调用子对象列表中每一个对象的析构函数也就是说quit 此时就被析构了。然后代码继续执行在 window 析构之后quit 也会被析构因为 quit 也是一个局部变量在超出作用域的时候当然也需要析构。但是这时候已经是第二次调用 quit 的析构函数了C不允许调用两次析构函数因此程序崩溃了。 由此我们看到Qt 的对象树机制虽然在一定程度上解决了内存问题但是也引入了一些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下所以我们最好从开始就养成良好习惯即 在 Qt 中尽量将其开辟在堆上并指定好其 parent 父类对象 比如 如果我们把最初的代码改成在栈上开辟的话我们运行程序会发现什么都没有 Qt 对象树如下 2.2 验证对象树 首先我们自定义一个label类并在析构部分打上日志如下步骤 ① 选中工程名鼠标右键-------add new...或 添加新文件 结果图如下  上面 Qt Creator 是帮我们生成了一些代码但是没完全生成头文件没有给我们主动包含上面的头文件也是我自己手动包含的 此时我们可以按F4来进行 .h文件 和 .cpp文件 来回切换 此时我们的 mylabel.cpp 中就是 #include mylabel.h #include iostreamMyLabel::MyLabel(QWidget* parent) : QLabel(parent) { }MyLabel::~MyLabel() {std::cout MyLabel 被销毁 std::endl; }midget.cpp 中的代码就是 #include widget.h #include ui_widget.h #include mylabel.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this); // 将form file生成的界面和我们当前的widget进行关联起来// 使用自己定义的 MyLabel 代替原来的 QLabel所谓的 “继承” 本质上是扩展保持原有功能不变的基础上// 给对象扩展出一个析构函数通过这个析构函数打印一个自定义日志方便观察程序运行结果MyLabel *label new MyLabel(this);label-setText(Hello World);}Widget::~Widget() {delete ui; } 此时我们运行代码就可以看到窗口上有 Hello World 的字样只要我们关闭窗口就会输出我们的日志 这里也是验证了对象树自动释放对象的能力 这里日志是有的说明析构函数是执行了虽然没有 手动 delete但是由于把 MyLabel 挂到了对象树上此时窗口被销毁的时候就会自动销毁对象树中的所有对象所以MyLabel 的析构是执行到了 但是这里似乎出现了乱码的情况 乱码问题出现的原因有且仅有一个 编码方式不匹配不仅仅局限于 C比如字符串本身是 utf8 编码的但是终端控制台是按照 gbk 的方式来解析显示的就会出现乱码相当于拿着 utf8 的数值 去查询 gbk 的 码表 utf8 和 gbk  目前,表示汉字字符集, 主要是两种方式 GBK(中国大陆) 使用 2 个字节表示一个汉字Windows 简体中文版默认的字符集就是 GBKUTF-8 / utf8 变长编码表示一个符号使用的字节数有变化2-4但是在 utf8 中。一个汉字一般是 3 个字节Linux 默认就是 utf8 3. 解决编码问题 我们用文本文件打开 mylabel.cpp 文件可以看到这个文件的编码方式 可看到这个文件的编码方式是 utf8但是  Qt 的这个终端的编码方式肯定不是 utf8 但是Qt不支持修改编码方式所以这里我们就需要借助 Qt 自己提供的打印日志的功能 qDebug或者使用 QString 来处理编码方式。 #include mylabel.h #include iostream#include QtDebug // 头文件MyLabel::MyLabel(QWidget* parent) : QLabel(parent) {}MyLabel::~MyLabel() {// std::cout MyLabel 被销毁 std::endl;qDebug() MyLabel 被销毁; // qDebug 这个宏封装了 QDebug 对象使用 qDebug 相当于使用 cout }#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug 此时中文就不会出现乱码情况如下  后续在 Qt 中,如果想通过打印日志的方式输出一些调试信息都优先使用 qDebug。虽然使用 cout 也行但是 cout 对于编码的处理不太好在windows 上容易出现乱码(如果是 Linux 使用 Qt Creator 一般就没事了Linux 默认的编码一般都是 utf8)使用 qDebug, 还有一个好处打印的调试日志是可以统一进行关闭的!!输出的日志是开发阶段、调试程序的时候使用的。如果你的程序发布给用户不希望用户看到这些日志的!!qDebug 可以通过编译开关来实现一键式关闭 之前调试程序, 都是用调试器.VS/gdb这里为啥要打印日志调试呢?? 调试器很多时候是有局限性的是无法使用的,假设当前 bug 是一个概率性的 bug。出现的概率是 1% 甚至更小要想调试无法使用调试器了使用 日志  就可以很好的解决这种问题无论是哪种方式本质上都是观察程序执行的中间过程和中间结果~ 4. Qt 编程注意事项 4.1 Qt 中的命名事项 类名首字母大写单词和单词之间首字母大写;函数名及变量名首字母小写单词和单词之间首字母大写起的名字要有描述性不要使用 abc, xyz 这种比较无规律的名字来描述如果名字比较长由多个单词构成的就需要使用适当的方式来进行区分不同单词一般可以采用 蛇形命名法 或者 驼峰命名法 4.2 Qt Creator 中的快捷键 注释ctrl/运行ctrlR编译ctrlB字体缩放ctrl鼠标滑轮查找ctrlF整行移动ctrlshift↑/↓帮助文档F1自动对齐ctrli同名之间的.h和.cpp 的切换F4生成函数声明的对应定义altenter 4.3 使用帮助文档 打开帮助文档有三种方式,实际编程中使用哪种都可以 光标放到要查询的类名/方法名上,直接按 F1Qt Creator 左侧边栏中直接用鼠标单击帮助按钮 点击 帮助 之后出现如下图 3、找到 Qt Creator 的安装路径在 bin 文件夹下找到 assistant.exe双击打开 使用示例 新建项目在新建的项目中使用 Qt 中的QpushButton 控件。打开帮助手册在索引里面输入QpushButton: 注意一定不要使用中文文档 阅读英文文档是每个程序员必备的专业技能必须要练不能退缩Qt的文档从通俗易懂的角度来说是技术类文档中非常出类拔萃的只要大家稍微有点耐心基本都能读懂个八九不十 5. 补充 -- 析构函数执行顺序 mylabel.cpp #include mylabel.h #include iostream#include QtDebugMyLabel::MyLabel(QWidget* parent) : QLabel(parent) {qDebug() mylabel.cpp 构造函数被调用; }MyLabel::~MyLabel() {qDebug() mylabel.cpp 析构函数被调用; }widget.cpp #include widget.h // 创建生成时的文件 #include ui_widget.h #include QLabel // 包含标签的头文件 #include mylabel.h #include QDebugWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-setupUi(this); // 将form file生成的界面和我们当前的widget进行关联起来// 使用自己定义的 MyLabel 代替原来的 QLabel所谓的 “继承” 本质上是扩展保持原有功能不变的基础上// 给对象扩展出一个析构函数通过这个析构函数打印一个自定义日志方便观察程序运行结果MyLabel *label new MyLabel(this);label-setText(Hello World);}Widget::~Widget() {qDebug() midget 析构函数被调用;delete ui; } 运行结果如下  对象树确保的是先释放子节点的内存后释放父节点的内存而析构函数的调用顺序则不一定遵守上述要求因此看到子节点的析构执行顺序反而在父节点析构顺序之后 注意调用析构函数和释放内存并非是同一件事情 6. 小结 认识 QLabel 类能够在界面上显示字符串。通过 setText 来设置的参数 QStringQt 中把 C 里的很多容器类进行了重新封装历史原因内存泄露/文件资源泄露对象树 Qt 中通过对象树来统一的释放界面的控件对象Qt 还是推荐使用 new 的方式在堆上创建对象通过对象树,统一释放对象创建对象的时候,在构造函数中,指定父对象(此时才会挂到对象树上)如果你的对象没有挂到对象树上,就必须要记得手动释放!!通过继承自 Qt 内置的类就可以达到对现有控件进行功能扩展效果Qt 内置的 QLabel没法看到销毁过程的。为了看清楚就创建类 MyLabel 继承自 QLabel 重写析构函数。在析构函数中加上日志,直观的观察到对象释放的过程了也可以重写控件中的任何功能。不仅仅是析构函数 达到功能扩展目的乱码问题 和 字符集~ MySQL(很多地方都涉及到)如何在 Qt 中打印日志,作为调试信息使用 cout 固然可以, 但是并不是上策字符编码处理的不好,也不方便统一进行关闭Qt 中推荐使用 qDebug() 完成日志的打印 【*★,°*:.☆(▽)/$:*.°★* 】那么  本篇到此就结束啦如果我的这篇博客可以给你提供有益的参考和启示可以三连支持一下
http://www.tj-hxxt.cn/news/226645.html

相关文章:

  • 桥的设计网站建设wordpress个人版支付
  • 网站建设招标提问编写网站策划方案
  • 织梦网站教程id怎么自动导入wordpress
  • 网站优化要做哪些课程设计做淘宝网站的目的
  • 网站开发和浏览器兼容问题域名是什么意思
  • 东莞手机网站设计公司在线网页代理太太猫
  • 建筑公司网站石家庄网站建设 朝阳区
  • 合肥网站建设 卫来网络中小企业局域网组网方案
  • 商务网站建设论文总结jsp做网站实例教程
  • 沈阳快速建站公司有哪些广告公司取名大全最新版的
  • 怎样做网站xml潍坊企业网络推广
  • 做论坛网站如何赚钱环保公司网站模版
  • 网站建设微信商城网站制作怎样做销售网站
  • 大连地区做网站做网站 服务器
  • 企业网站备案时间东莞网站营销策划
  • 荥阳网站建设价格按天计费的seo弊端
  • 阿里云做网站的代码页游平台
  • 高平市网站建设公司怎么生成链接
  • 大型电子商务系统网站建设wordpress apply filters
  • 做业务在那几个网站上找客户端海城建设网站
  • 柳州 网站推广网站建设属于硬件还是软件
  • 查看邮箱注册过的网站wordpress最新视频教程
  • 京东商城商务网站建设目的网站建设管理中se是什么意思
  • 那些小网站是哪里人做的网页小游戏flash不能正常运行
  • 做网站图片表情饮料网站建设规划书
  • 刷网站关学校网站要更新应怎么做
  • wordpress改站点地址台州网站推广优化
  • 设计通网站建设网站备案不能访问
  • 安徽池州建设厅网站重庆网站推广转化率
  • 网站建设需要资料wordpress文章模版