通过手写qt代码来认识qt程序的构成,以及特性。设计一个查找对话框。以下是设计过程
1 新建一个empty qt project
2 配置pro文件

HEADERS += \Find.h
QT += widgetsSOURCES += \Find.cpp \main.cpp

3 编写对话框的类
代码例如以下:

//Find.h
#ifndef FIND_H
#define FIND_H
#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
class FindDialog : public QDialog
{Q_OBJECT
public:FindDialog(QWidget *parent = NULL);
signals:void findNext(const QString &str,Qt::CaseSensitivity cs);void findPrevious(const QString &str,Qt::CaseSensitivity cs);
private slots:void findClicled();void enableFindButton(const QString &text);
private:QLabel* label;QLineEdit*  lineEdit;QCheckBox*  caseCheckBox;QCheckBox*  backwardCheckBox;QPushButton*    findButton;QPushButton*    closeButton;
};
#endif // FIND_H
//Find.cpp
#include <QtGui>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>
#include "Find.h"FindDialog::FindDialog(QWidget *parent)
{label = new QLabel(tr("Find &what"));lineEdit = new QLineEdit;label->setBuddy(lineEdit);caseCheckBox = new QCheckBox(tr("Match &case"));backwardCheckBox = new QCheckBox(tr("Serach &backward"));findButton = new QPushButton(tr("&Find"));closeButton = new QPushButton(tr("&Close"));findButton->setDefault(true);findButton->setEnabled(false);connect(lineEdit,SIGNAL(textChanged(const QString&)),this,SLOT( enableFindButton(const QString&) ) );connect(findButton,SIGNAL(clicked()),this,SLOT(findClicked()));connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));QHBoxLayout* topLeftLayout = new QHBoxLayout;topLeftLayout->addWidget(label);topLeftLayout->addWidget(lineEdit);QVBoxLayout* leftLayout = new QVBoxLayout;leftLayout->addLayout(topLeftLayout);leftLayout->addWidget(caseCheckBox);leftLayout->addWidget(backwardCheckBox);QVBoxLayout* rightLayout = new QVBoxLayout;rightLayout->addWidget(findButton);rightLayout->addWidget(closeButton);rightLayout->addStretch();QHBoxLayout* mainLayout = new QHBoxLayout;mainLayout->addLayout(leftLayout);mainLayout->addLayout(rightLayout);setLayout(mainLayout);setWindowTitle(tr("Find"));setFixedHeight(sizeHint().height());
}void FindDialog::findClicled()
{QString text = lineEdit->text();Qt::CaseSensitivity cs = caseCheckBox->isChecked() ?

Qt::CaseSensitive : Qt::CaseInsensitive; if (backwardCheckBox->isChecked()) { emit(findPrevious(text,cs)); } else { emit(findNext(text,cs)); } } void FindDialog::enableFindButton(const QString& text) { }

//main.cpp
#include <QApplication>
#include "Find.h"int main(int argc,char* argv[])
{QApplication app(argc,argv);FindDialog *dialog = new FindDialog;dialog->show();return app.exec();
}

3 观察程序 类定义中的Q_OBEJECT
Q_OBEJECT是一个宏,对全部定义了信号和槽的类。在类定义開始处的Q_OBJECT宏是必须的。而且要直接或者间接的继承QObject

4 signals
<1>signals也是一个宏,能够在Qt的文件里看到Signals 就是 public,所以其前面不能加不论什么限定符.
<2>signals会被moc自己主动生成,所以一定不要在cpp文件里实现signals的函数
<3>signals的返回值仅仅能是void。
<4>signals中的函数原型必须和slots中的原型一致。例外的当slots中的參数比signals中少的时候。signal中的后面多余的參数会被忽略。
<5>signals 能够有默认參数

5 slots
<1>slots 是普通的C++函数,前面能够加限定符,public。private,protected,virtual。

<2>slots能够有默认參数
<3> signals 和slots的机制非常像回调函数机制,就是用函数指针指向函数。

6 connect函数--信号和槽的连接
connec(sender,SIGNALE(xx),receiver,SLOTS(yy));
一个信号能够连接多个槽;多个信号能够连接到一个槽;一个信号能够和信号连接;连接能够被移除。

7 qt会在删除父对象的时候会自己主动删除全部的子对象,所以来写析构函数来释放新建的部件和布局是多余的。

8 布局
<1>Layout能够加入widget;
<2>Layout能够加入Layout
<3>widget能够加入Layout
<4>QVBoxLayout。QHBoxLayout。分别表示纵向,横向布局。

<5>程序终于一定要有个Layout来罩住全部的Layout。

9 main函数解析

#include <QApplication>
#include "Find.h"
int main(int argc,char* argv[])
{QApplication app(argc,argv); //app用来管理整个应用程序使用到的资源FindDialog *dialog = new FindDialog;dialog->show();return app.exec(); //将应用程序的控制权交给qt,程序会进入事件循环状态。
}

转载于:https://www.cnblogs.com/liguangsunls/p/6834823.html

qt之旅-1纯手写Qt界面相关推荐

  1. qt绘制运动物体_手写QT贪吃蛇,小白高薪捷径-Qt开发

    1. C/C++初学者的困惑 很多C/C++初学者,自学了很多年,考了很多证,开发水平仍停留在控制台小项目上,就业更是遥遥无期,进退两难. C/C++的最强大的地方,当然是开发高性能框架.高性能服务器 ...

  2. IOS纯手写代码支持旋屏

    2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...

  3. 【手写系列】纯手写实现一个高可用的RPC

    前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A.通常都是B把API上传到Maven私服,然后B开始写A ...

  4. 【手写系列】纯手写实现JDK动态代理

    前言 在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架.JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充.本 ...

  5. 超级简单的jQuery纯手写五星评分效果

    超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...

  6. SQL纯手写创建数据库到表内内容

    建表啥的只点点鼠标,太外行了,不如来看看我的纯手写,让表从无到有一系列:还有存储过程临时表,不间断的重排序: 一:建数据库 1create Database Show 2 on 3 primary 4 ...

  7. vue+js纯手写日历(包含农历,节假日)

    vue+js纯手写日历(包含农历,节假日) 使用的js 地址 dataChange.js 插件使用了elementui //完整代码 <template><div><di ...

  8. HTML5期末大作业:商城网站设计——仿唯品会购物商城(5页) 纯手写-高质量 HTML+CSS+JavaScript

    HTML5期末大作业:商城购物网站设计--仿唯品会商城(5页) 纯手写 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 常见网页设计 ...

  9. 纯手写归纳hmm 模型

    纯手写归纳hmm 模型

最新文章

  1. 百练OJ:1013:Counterfeit Dollar(假币)
  2. 全国计算机等级考试题库二级C操作题100套(第53套)
  3. .NET系统架构改造的经验和教训
  4. Css基本语法及页面引用
  5. 飞鸽传书mayfish 数据入库验证
  6. docker删除mongo数据库库_Docker 搭建MongoDB环境
  7. 删除git中缓存的用户名和密码
  8. HNOI2019爆零记
  9. JDBC高级特性(一)结果集,批量更新
  10. SpringMVC+MyBatis整合——事务管理
  11. Spring Boot 中实现定时任务的常用方式--Quartz
  12. c语言入门手机自学软件,C语言入门学习
  13. 英语国际音标发音——见标能读
  14. 计算机删除用户8,Win8.1如何删除账户?
  15. linux代码丢了,Linux 使用ss命令代替 netstat
  16. 我以为你懂的。懂得我是特别的
  17. Fiddler+手机模拟器+java采集抖音评论数据
  18. vue(slot-卡槽)
  19. Gitee配置静态页面
  20. 基于STM32F103的USB学习笔记38 - Mass Storage之SPI Flash做U盘

热门文章

  1. 2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段
  2. mysql alter怎么用,mysql alter话语用法
  3. MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...
  4. iis服务器显示http1.1,IIS服务器“500”内部错误 HTTP/1.1 新建会话失败
  5. iptables 配置后连接不上数据库_Linux服务器配置-VSFTP服务配置(三)
  6. lodop转到其他html页面,Lodop实现打印功能
  7. python post请求实例_Python使用requests发送POST请求实例代码
  8. C排序算法:(二)冒泡排序
  9. 在一个风景秀丽的小镇,一天早上,有N名晨跑爱好者(编号1~N)沿着优雅的江边景观道朝同一方向进行晨跑
  10. 改变Jupyter的默认项目路径