qt之旅-1纯手写Qt界面
通过手写qt代码来认识qt程序的构成,以及特性。设计一个查找对话框。以下是设计过程
1 新建一个empty qt project
2 配置pro文件
HEADERS += \
Find.h
QT += widgets SOURCES += \
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,程序会进入事件循环状态。
}
qt之旅-1纯手写Qt界面的更多相关文章
- springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用 ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Pr ...
- 简易-五星评分-jQuery纯手写
超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...
- vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件
vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...
- 超级简单的jQuery纯手写五星评分效果
超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...
- 纯手写Myatis框架
1.接口层-和数据库交互的方式 MyBatis和数据库的交互有两种方式: 使用传统的MyBatis提供的API: 使用Mapper接口: 2.使用Mapper接口 MyBatis 将配置文件中的每一个 ...
- SQL纯手写创建数据库到表内内容
建表啥的只点点鼠标,太外行了,不如来看看我的纯手写,让表从无到有一系列:还有存储过程临时表,不间断的重排序: 一:建数据库 create Database Show on primary ( name ...
- 纯手写SpringMVC到SpringBoot框架项目实战
引言 Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 通过这种方式,springboot ...
- 纯手写实现ajax分页功能
前言 最近用到了这个功能,百度大半天,网上的不是有各种问题就是需要引入其他的插件,无奈,只能自己写,大致功能已经完成.前端页面用bootstrap做样式,分页功能用ajax实现,没用其他插件哦,只引入 ...
- 纯手写SpringMVC架构,用注解实现springmvc过程
1.第一步,首先搭建如下架构,其中,annotation中放置自己编写的注解,主要包括service controller qualifier RequestMapping 第二步:完成对应的anno ...
随机推荐
- vector性能调优之resize与reserve
vector的resize与reserve reserve()函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size) resize() 函数( void resi ...
- iPhone模拟定位(非越狱修改手机定位)
剩下的事情就是build一下到手机,那么,就可以看到神奇的效果! 本次带来一个简单又好玩的实用功能,比如定位装逼(共享定位非分享可选那种),又或者定位打卡之类,由于改变的是设备级别的定位,本设备所 ...
- python书籍推荐:量化投资:以Python为工具
所属网站分类: 资源下载 > python电子书 作者:mimi 链接:http://www.pythonheidong.com/blog/article/451/ 来源:python黑洞网 内 ...
- Cable master 求电缆的最大长度(二分法)
Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...
- [mvc]MVC_Model
1,Model的职责: Model只负责与数据处理相关的工作. 2,开发Model的基本观念 采用ORM信息访问技术开发 ORM是将结构化的关系型数据,映射成面向对象模型.对于EF来说,就是关系型数据 ...
- Problem 2125 简单的等式(FZU),,数学题。。。
Problem 2125 简单的等式 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 现在有一个等式如下:x^2+ ...
- 《Shell脚本学习指南》书籍目录
摘要:Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更 ...
- 骑士精神 (codevs 2449)
题目描述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标 ...
- PHP 常见问题3
1,Http 和 Https 的区别 第一:http 是超文本传输协议,信息是明文传输,https 是具有安全性的 ssl 加密传输协议 第二:http 和 https 使用的是完全不同的连接方式,端 ...
- java 字节码 指令集
有时候为了能理解JVM对程序所做的优化等,需要查看程序的字节码,因此知道了解一些常见的指令集很重要! 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推 ...