赞
踩
上一节我们讲了除界面文件ui文件其他的所有文件,这一节我们来介绍一下ui文件:在文件目录中我们能看到界面文件这一栏,点击展开我们可以看到一个以".ui"结尾的文件,双击我们会看到如下界面:
我们在右侧选中label和PushButton拖入到工作台上的窗口中,并双击输入名字
然后点击运行
随后就可以看到我们拖拽进去的label和button显示在窗口上了,那么就会有这样一个疑问,在我们点击运行之后,其他文件中的代码没有被改变,那么这是如何实现的呢?
下面我来解答一下:在运行完之后系统会在我们的存储路径中新生成一个开头为"build"的文件:
双击点进去会看到一个 ui开头.h结尾的文件
双击点进去之后我们会看到一大坨代码,不要着急,我们来依次解释一下:
首先 我们先看Ui MainWindow类中设置的几个指针对象:
它们分别对应着
不知道大家是否还记得上一节我们在.h头文件中简单介绍过ui指针
在.h头文件中我们私有定义了一个Ui作用域中的MainWindow类型的ui指针,下面我们先来解释一下:
我们回到本节提到的.ui文件:可以看到有一部分代码为
我们在Ui作用域中将MainWindow类公有继承Ui_MainWindow,但是没有写其他的东西,那么我们就可以认为MainWindow类和Ui_MainWindow类中的内容是一样的;然后我们再回到.h头文件中:
在文件的开头部分我们申明了一下Ui作用域,并在MainWindow类中私有创建了一个Ui作用域中的MainWindow类型的ui指针(MainWindow继承了Ui_MainWindow);下面我们再来看一下MainWindow.cpp文件:
在MainWindow.cpp文件中我们将头文件中定义的ui指针初始化,并将ui指针调用了MainWindow从Ui_MainWindow中继承的函数"setupUi"函数,将MainWindow的this指针传入进去。
接下来我们再看ui文件中其他部分:
剩下这部分理解起来就很简单了,注意一下这个retranslateUi函数中的代码作用是设置label和Button所显示的数据:
信号槽是Qt框架中非常重要的一个机制,它实际上就是观察者模式;当某个时间发生之后,例如对象A检测到自己被点击了一下,那么它就会发出一个信号(signal)。这种发出是没有目标的,也就是没有指向的,类似于广播。但是如果有个对象B对这个信号感兴趣,那么它就会使用连接(connect)函数,意思就是:将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。
下面我们来用代码举一个例子:
因为要创建一个按钮,我们在main.cpp文件中引入了一个QPushButton头文件,随后创建了一个QPushButton对象,并让其显示出来,但是在运行的时候却出现了两个窗口——一个按钮窗口,一个主窗口,并且两个窗口是相互独立的,那么我们要如何解决这一问题呢 ?这就要提到Qt的对象处理机制了。
首先我们把鼠标放在QPushButton上按一下键盘上的F2进入,我们可以看到QPushButton的构造函数,一个构造函数中有一个QWidget类型(QWidget是所有窗口类的基类)的parent指针,当我们把主窗口对象的地址传给QPushButton的构造函数时,我们的主窗口就是QPushButton创造对象的"父亲",在这个主窗口对象里就会生成一个链表,链表会存储它的孩子——QPushButton对象,当主窗口销毁时会和QPushButton对象一起销毁:
这样按钮和主窗口就会出现在一个窗口上了,当主窗口关闭的时候按钮也会随之一起关闭 。
下面我们来利用槽函数来实现:点击按钮关闭窗口这一功能:
我们要用到QObject作用域里的connect函数,connect函数中前四个参数分别为:信号发出者--信号--信号接收者--槽函数,connect()函数最常用的一般形式:connect(sender,signal,receiver,slot);
这样,我们就实现了点击按钮关闭窗口这一功能了。
学完了信号和槽,我们再来看一下MainWindow.cpp文件中的Q_OBJECT是什么:
首先有信号槽的机制必须有Q_OBJECR,QObject是所有类的基类(也包括Qwidget)。
接下来,我们再来做一个有挑战性的:实现点击按钮之后按钮在窗口上随机位置显示:
因为QPushButton没有随机显示按钮这一函数,我们可以自己写一个类继承QPushButton,并在其中写一个随机移动的函数步骤如下:
这样就实现了点击按钮->按钮随机出现这一功能:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。