在这简单介绍几个常用的控件,初步了解(肥肠的重要),深入请跟着我一起往后看。
按钮组包括的按钮有:
Push Button: 按钮
Tool Button: 工具按钮
Radio Button: 单选按钮
Check Box: 复选框
Command Link Button: 命令链接按钮
Dialog Button Box: 对话框按钮盒
下面以QPushButton举例介绍一下按钮的用法。
#include
//主要代码 后续 会将源码上传的 目前还在整理
setMinimumSize(200,120);
setMaximumSize(200,120);
QPushButton *quit = new QPushButton("Quit",this);
quit->setGeometry(62,40,75,30);
quit->setFont(QFont("Times",18,QFont::Bold));
connect(quit,SIGNAL(clicked()),this,SLOT(close()));
如图
点击按钮会关闭此窗口
输入部件组有很多,名称依次如下:
下面简单介绍一下日期时间定时相关的部件类
Date/Time Edit 对应的是 QDateTime类,在Qt5中可以获取系统的时间,通过QDateTime::currentDateTime()可以获取本地系统的时间和日期,可以分别通过date()、time()来返回日期或者时间部分。演示如下:
QLabel *datalabel = new QLabel();
QDateTime *datatime = new QDateTime(QDateTime::currentDateTime());
datalabel->setText(datatime->date().toString());
datalabel->show();
定时器使用起来肥肠滴简单,只需要几个步骤就可以完成其应用了
新建一个定时器
QTimer *time_clock = new QTimer(parent);
连接这个定时器的信号与槽,利用定时器的timeout()函数
conect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));
开启定时器并且设置定时周期即可
定时器有两种方式,start(int time)和setSingleShot()。其中start(int time)表示每隔time秒就会重启定时器,可以重复触发定时器,利用stop()可以关闭定时器,和setSingleShot()则仅启动定时器一次。我们常用的是第一种
比如
time_clock->start(2000);
如图显示:
可以获取到当天的日期和星期几
显示部件组各个控件的名称解释如下:
下面介绍几个控件(很简单的介绍,后去等我看到详细用法会更的)
Graphics View对应的是QGraphicsView类,提供了Qt5的图形视图框架,作用后续我们慢慢来学。
Text Browser对应的是QTextBrowser类,QTextBrowser类继承QTextEdit,而且仅是只读的,对里面的内容并不能进行修改,但是相对于QTextEdit,他还具有链接文本的作用,他的属性有以下几点:
modified : const bool
openExternalLinks : bool
openLinks : bool
readOnly : bool
searchPaths : bool
source : QUrl
undoRedoEnabled : const bool
通过上面的属性设置,可以设定它是否允许外部链接,是否是只读,外部链接的位置以及连接的内容,是否可以进行撤销等操作。
QTextBrowser还提供了几种比较有用的槽函数(SLOTS)
virtual void backward()
virtual void forward()
virtual void home()
可以通过这个槽来达到“翻页”的效果
传统的QWidget程序可以使用这个部件来嵌入QML代码,为开发者提供了方便,但是目前QML中不能嵌入其他非QML窗口,因为QML和QWidget的渲染机制是不同的。
这一组中只有两个空间,名称如下
使用方法后面会写一个小例子。
布局管理组中各个控件的名称解释如下:
后续使用就好了 这个没什么说的。
上面三块会单独拿出一个文章去讲,涉及到的只是比较多并且很重要,也会有一段相对较长的代码
简单来说就是将上面提到的几个控件综合起来使用
首先新建一个Qt Widgets Application项目,基类选择QDialog(这个不会就搜一搜,帖子多的烂掉了),选择创建界面,也就是自动带有ui文件。
在左边资源文件中点击.ui文件即可进入设计模式,我们此时拖拽一些我们需要的控件, 一个label 一个Line Eidt,一个Horizontal Spacer以及两个Push Button。
不需要对这些空间的位置进行编排,一会可以使用布局进行编排。
如图:
设计界面
拖拽控件
对Widget属性的一些设置:
选择label 将其text命名为&Cell Location。
选择第一个按钮,修改属性值为okBtn enabled属性不勾选,并且将text改为OK,default属性设置true
将第二个按钮属性值修改为cancelBtn,text改为cancel
表单背景 也就是窗体的名称 window Title 改为 Go To Cell
控件绑定
可以看到目前label名称前面会显示&,使用Edit Buddies(设计模式上面一排的其中一个)模式下,设定伙伴,选中label并拖拽至lineEdit然后松开可以看到下图一样的红色箭头,就表示成功了。标签的前面会有一个横,但是没有&了 我们再点击Edit Widgets就可以回到原来的编辑模式了,具体可以看图。
布局
使用 Ctrl键可以一次选取多个控件,首选选取label和lineEdit, 点击上方工具栏中的水平布局(如图),同样的 我们将其他三个控件也进行水平布局,最后我们选择整个form,选择垂直布局,最后我们点击工具栏中最后一个,窗口会自动调整为合适的大小。
Tab顺序
话不多说 直接上图。
private slots:
void on_lineEdit_textChanged();
ui->setupUi(this); //可以自动建立signal-slot链接
QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");//正则表达式限制输入字元的范围
ui->lineEdit->setValidator(new QRegExpValidator(regExp,this));//QRegExpValidator 搭配正则使用,不要忘记头文件
connect(ui->okBtn,SIGNAL(clicked()),this,SLOT(accept()));//点击槽 链接 accept()函数
connect(ui->cancelBtn,SIGNAL(clicked()),this,SLOT(reject()));
accept和reject都会关闭这个视窗,但是前者返回值1,后者则是0,借此判断是按下了哪个按钮
void mytest_dialog::on_lineEdit_textChanged()
{
ui->okBtn->setEnabled(ui->lineEdit->hasAcceptableInput());
}
最终实现如图:
如果输入不符合正则是无法输入的。
隐式共享
概念: 隐式共享又称为回写复制,当两个对象共享同一份数据时(通过浅拷贝实现数据块的共享),如果数据不改变,则不进行数据的复制,而当某个对象需要改变数据时,则执行新拷贝。
浅拷贝:简单来说就是两个人用同一个东西。
深拷贝:复制出来一个一摸一样的,两个人一人一个。
QString就是采用了隐式共享技术,结合了深拷贝和浅拷贝,提高效率。
Qt中还支持隐式共享的类还有:
内存分配策略
QString在一个连续的内存块中存储数据,如果我们不断的增大他的长度,他就需要重新分配空间,他的分配策略如下:
Qt::WindowFlags枚举类型
函数:setWindowFlag()/setWindowFlags();
Qt::WindowFlags枚举类型有以下几种形式:
窗口提示可以进行位或操作:
Qt::WindowContextHelpButtonHint | Qt::WindowMaximizeButtonHint
如果Qt::WindowFlags的窗口提示为0时,窗口提示不起作用,当有一个窗口提示被应用时,若想要其他窗口提示起作用,则必须使用位或操作,比如:
Qt::WindowFlags flags = Qt::Window;
widget->setWindowFlags(flags);
此代码表示widget是一个窗口,他和一般的窗口外观一直,最大化、最小化、关闭、标题栏等等,此时窗口提示是不起作用的例如:
flags |= Qt::WindowTitleHint;
widget->setWindowFlags(flags);
上述代码的执行,将会使窗口提示发挥作用,但是要对应操作系统,比如windows中存在标题栏,但是X11窗口管理器忽略了窗口提示Qt::WindowTitleHint,比如在红旗linux工作站和suse系统上,上面的代码就是没有作用的。