ui文件以及信号和槽机制
ui文件
上一节我们讲了除界面文件ui文件其他的所有文件,这一节我们来介绍一下ui文件:在文件目录中我们能看到界面文件这一栏,点击展开我们可以看到一个以".ui"结尾的文件,双击我们会看到如下界面:
我们在右侧选中label和PushButton拖入到工作台上的窗口中,并双击输入名字
然后点击运行
随后就可以看到我们拖拽进去的label和button显示在窗口上了,那么就会有这样一个疑问,在我们点击运行之后,其他文件中的代码没有被改变,那么这是如何实现的呢?
下面我来解答一下:在运行完之后系统会在我们的存储路径中新生成一个开头为"build"的文件:
双击点进去会看到一个 ui开头.h结尾的文件
双击点进去之后我们会看到一大坨代码,不要着急,我们来依次解释一下:
首先 我们先看Ui MainWindow类中设置的几个指针对象:
它们分别对应着
- 中心窗口:就是运行之后弹出的窗口中间灰色的那部分
- label: 后拖拽进来的label部分,如果没拖拽就不会有这个指针
- Button:后拖拽进来的Button部分,没拖拽的话同上
- menuBar:菜单栏
- mainToolBar:工具栏
- statusBar:状态栏
不知道大家是否还记得上一节我们在.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,并在其中写一个随机移动的函数步骤如下:
- 实现(按钮,点击,按钮,随机移动)这一流程
- 建立一个MyButton类,类中引入QPushButton头文件,共有继承QPushButton
- 然后在MyButton.h中声明一下我们自己要写的ReMove()函数
- 在MyButton.cpp文件中将初始化参数列表中显示父类构造改成显示QPushButton构造
- 在main.cpp中引入我们自己写的MyButton.h头文件注意用双引号
- 因为是随机显示,所以在main.cpp文件中也要引入时间头文件time.h,然后写入srand(time(0))
- 将主窗口扩大一些,使用resize()函数设置1500*1000像素大小
- 定义MyButton类型的对象
- 并在MyButton.cpp文件中实现ReMove()函数:定义x,y变量且分别在主窗口范围内,所以x = rand()%1500,y = rand()%1000,接着用this指针调用QPushButton中的move(x,y)函数
这样就实现了点击按钮->按钮随机出现这一功能:
文章来源:https://www.toymoban.com/news/detail-844678.html
文章来源地址https://www.toymoban.com/news/detail-844678.html
到了这里,关于QT基础之——ui文件以及信号和槽机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!