Qt”速成”(2)——让你的程序活起来

0x00.本课你将学到

0x01.Qt资源文件

Qt的资源文件用于存储Qt程序中可能会用到的各种乱七八糟的文件,包括但不限于图片视频文档等,所有的文件都可以放到里面

Qt的资源文件在编译过程中会编译到exe文件中,比如我曾经给一个Qt程序内置了很多视频,最终exe编译出来三四百MB

0x01.0x01.新建资源文件

在Qt Creator中的工程文件上右键,点击Add New

选择Qt->Qt Resource File,点击Choose,输入文件名,最后点击完成

我们可以看到,Qt Creator工程目录中出现了qrc文件,我们可以在这里存放资源

0x01.0x02.向资源文件中存放文件

点击Add Prefix,添加资源文件前缀,前缀可以理解为文件夹,用于给不同的资源文件分类

选中要添加文件的前缀,点击Add Files选择文件,按下Ctrl+S即可添加成功

0x02.QPushButton介绍

我们在Qt Designer中添加QPushButton后可以发现,QPushButton继承自QAbstractButton,QAbstractButton继承自QWidget,QWidget继承自QObject。

上节课我们已经介绍过了QObject和QWidget中的组件,因此就不再赘述,我们直接来看QAbstractButton和QPushButton。

猜一下QAbstractButton中的text是什么含义呢?

和QLabel中的text含义一致,为显示的文本(下图字体已经在QWidget的font中修改)

icon什么意思呢?icon是指图标,那么在按钮上设置图标有什么作用呢?我在icon的“正常 关”中导入了资源文件中的图片,就显示出了效果

shortcut指快捷键,按下快捷键就代表着按下了当前的按钮

checkable指允许选中,点击按钮后会选中按钮,并不会自动松开

autoRepeat代表是否允许长按的时候代替连续点击,下图勾选了autoRepeat,并且设置了按下按钮就打印123

autoexclusive指是否具有排他性,如果多个按钮属于同一个父控件(比如在上面的例子中,Label和PushButton直接属于同一个Widget窗口),则自动取消选中其他按钮

autoRepeatDelay和autoRepeatInterval分别指,长按autoRepeatDelay毫秒认为进入了长按模式,每隔autoRepeatInterval触发一次,认为按下了按钮

再看QPushButton的属性,两个default指默认选中该按钮,其中default的优先级比autoDefault高,我们再来看看flat,flat指按钮扁平化

普通按钮
flat按钮

0x03.信号和槽机制

接下来学到的就是Qt的精华了,信号和槽机制,下面先简单介绍一下什么是信号,什么是槽

0x03.0x01.信号和槽的本质

信号和槽的本质都是函数,信号需要被Qt组件的函数调用,槽被Qt调用

相信到这里你可能还是不太明白信号和槽是什么东西,用通俗的话来讲,槽就是信号接收器,当槽发现某个组件发出了对应的信号,槽就知道自己该执行对应的功能了。

0x03.0x02.信号具体是指什么

信号往往是人对于组件的操作,比如按下按钮,双击按钮等等

但是也有一些特殊的,程序可以自己激发的信号,比如QTimer计时器,时间到了会自动触发timeout信号

也有程序员自己编写的信号

0x03.0x03.如何编写槽

我们先打开想要编写槽的组件的头文件,在本课中,就是整个窗口,也就是firstwidget.h,在头文件中添加如下行

我们可以看到,其实Qt的语法和C++还是很像的,protected和C++的protected含义一致,slots表示下面的函数是槽函数。

然后打开firstwidget.cpp,在文件中添加如下行。

其中ui指加载ui文件得出的窗口布局,ui->label指操作label,这里的变量名来自下图框框的位置

setText是QLabel的一个函数,作用是替换QLabel中的文字,就像它的名字一样,set Text

到目前为止,我们已经编写好了槽函数,那么如何连接信号和槽呢?

0x03.0x04.如何连接信号和槽

连接信号和槽需要调用一个函数,调用后即可连接,因此我将其写到firstwidget的构造函数中。

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(changeText()));

函数解读:

connect(发出信号的组件的指针, SIGNAL(信号函数(参数类型)), 接收信号的组件的指针, SLOT(槽函数(参数类型)));

我们来执行一下该程序

让我来分析一下信号和槽的整个过程

firstwidget构造的时候,将按钮的clicked信号和firstwidget的changeText槽连接到了一起,然后显示窗口。当我们点击按钮的时候,按钮释放clicked信号,该信号由于和changeText槽连到了一起,就”牵一发而动两发“,调用了changeText函数,在changeText中修改了label的文本

0x03.0x05.信号和槽传递参数

刚刚在函数解读中提到了参数,那我们来了解一下如何添加参数

connect(发出信号的组件的指针, SIGNAL(信号函数(参数类型)), 接收信号的组件的指针, SLOT(槽函数(参数类型)));

要添加参数,我们首先要知道信号能否发出参数。QPushButton有的信号中,有两个clicked函数,一个不带参数,一个带bool表示是否选中(与QAbstractButton中的checkable对应),与之对应的,我们的槽函数也要收到相匹配的参数,因此我们要修改槽函数和连接函数

完成上述修改后,我们重新编译运行一下我们编写的程序

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇