QT基础之——ui文件以及信号和槽机制

 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)函数

 这样就实现了点击按钮->按钮随机出现这一功能:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coke_3.2.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值