Qt6教程之二(3) Buttons

按钮是我们常用的控件,Qt中的按钮有push button 、tool button、radio button、check box、command link button、dialog button box几种。下面将依次进行介绍。

相信各位小伙伴到这里,对于创建项目、基本的工程文件结构也比较熟悉了,为了节约大家阅读的时间及控制文章篇幅,下面将只讲解重点相关部分。

对于创建工程、控件拖拽、控件布局等均不会再一一演示和讲解,忘各位小伙伴见谅,下面咱们正式开始写代码吧!

(一)  使用UI界面使用按钮

1、push button 

push button是比较常用的一个控件,在软件的各个交互页面会高频出现。首先在界面放置一个push button按钮,并双击按钮把名字改为 button,

这里为了演示按钮的作用,我们提前引入按钮事件(关于事件后面的教程会细细讲解) 的实现方法,在Qt中使用 信号与槽的技术来处理事件,那么当鼠标点击一下按钮时就产生了一个点击事件,下面将进行演示按钮事件如何使用。

首先点击信号与槽图标,

鼠标左键按住按钮不放向右滑动,此时会弹出槽函数选择框,

按照下述步骤进行操作,我们实现一个点击按钮关闭窗口的功能;

点击确定按钮后,如下(代表button按钮的clicked信号已经与窗口的close槽函数连接);

接着按下Ctrl +S 保存工程文件,我们运行程序,当点击按钮后窗口就会关闭,同时程序也会退出!

是不是非常简单,因为我们没写一行代码!

2、tool button

tool button (工具按钮)有区别于push button,工具按钮可以显示图标,并且有自己独有的四个属性:

同时还多一个trigered信号,就是实现弹出菜单,然后咱们点击了哪一项action,发射的信号。

工具菜单的使用场景:配合菜单栏、action使用,如实现图标按钮,伸缩式菜单等!

首先在UI界面拉取一个tool button,双击按钮把名字改为 工具按钮 ,同时设置显示图标和名字;

既然tool button同属于qt下的Buttons,那么push button有的属性和方法,tool button也是有的,下面我们来实现点击tool button的信号与槽的绑定,还是实现 关闭窗口的功能。

绑定信号与槽的操作方式与push button一样:

按下 Ctrl + S保存工程,然后运行程序,当点击toolbutton时,关闭窗口并退出程序。

另外上面提到的  trigered信号,直接使用UI界面的方式暂无实现方案,这个留到纯代码方式实现在讲解!

3、radio button

radio button称为单选框按钮,当多个radio button同属于一个父组件时,只能选择一个单选按钮,多个按钮之间形成互斥关系!

开始演示: 在UI界面放置3个radio button,

按下Ctrl+S 保存工程文件,运行程序后使用鼠标依次点击三个单选框按钮,你会发现始终只能选择一个,

接下来我们实现单选框按钮的事件,就是绑定信号与槽,

不用多说,push button按钮有的信号radio button大部分都有,比如绑定clicked信号实现关闭窗口和程序的功能,

当选中第一个按钮时,程序将关闭!

QRadioButton 没有自己独有的信号,可以使用pressed、released、clicked、toggled等信号。由于QRadioButton常用作选择按钮,需要判断选择状态,所以toggled信号比较常用,使用void toggled(bool checked);信号可以获得该按钮的选中状态,对于这个状态的监控我们留在纯代码实现时在详细讲解,toggled信号如下:(选中按钮实现窗口隐藏);

4、check box

check box是一个带文本标签的浮选框,这意味着当同一父组件下存在多个check box时,可以选中多个,与radio button刚好相反。

示范:   在UI界面放置五个check box复选框,并设置自己喜欢的文本,

保存工程文件,运行程序,可以直接选中五个复选框,

对于复选框,最常用的功能就是检测是否选中,信号为stateChange,

这里还是实现关闭程序的功能,至于检测是否选中的详细使用咱们留在纯代码实现时讲解!

 运行程序后,当选中第一个复选框时程序关闭,

5、command link button

command link button是命令链接按钮,可以显示图标和文字,常用于向导和对话框中的单选按钮的替代。

示范:在桌面拉取一个command link button控件,然后可以在右侧的属性栏设置图标、文字等,

咱们还是利用clicked信号来实现关闭程序的功能,

 

运行程序后,点击command link button将关闭窗口, 

 

其他详细功能我们在纯代码实现时详细讲解! 

6、dialog button box

dialog button box是一个包含很多按钮的控件,可以向QDialogButtonBox添加按钮,QDialogButtonBox会根据平台自动使用合适的布局。

示例: 在UI界面拉取一个dialog button box控件,然后在右侧属性栏找到standardButtons属性,可以按照需求选择多个按钮,并且设置按钮是以水平排列还是垂直排列;

比如设置为垂直排列,并选择多个按钮,

对于dialog button box的信号使用:

1当按钮的ButtonRole为AcceptRole或者YesRole时,会触发void QDialogButtonBox::accepted();

当按钮的ButtonRole为RejectRole或者NoRole时,会触发void QDialogButtonBox::rejected();

当按钮的ButtonRole为HelpRole时,会触发void QDialogButtonBox::helpRequested();

示例:

选择信号与槽绑定之后,运行程序,点击不同的按钮会依次实现不同类型的功能,如下面实现点击是之后关闭程序,点击否隐藏程序窗口但是不退出。其他详细的功能使用咱们放到纯代码实现时讲解!

 

 

(二)用纯代码使用按钮

1、push button 

2、tool button

3、radio button

4、check box

5、command link button

6、dialog button box

话不多说,直接上代码,这里为了方便,直接把五种按钮写一起了:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QRadioButton>
#include <QToolButton>
#include <QCheckBox>
#include <QCommandLinkButton>
#include <QDialogButtonBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:

    QPushButton *bt;
    QToolButton *toolButton;

    QRadioButton *toolBt;
    QRadioButton *toolBt2;
    QRadioButton *toolBt3;
    QRadioButton *toolBt4;
    QRadioButton *toolBt5;
    QRadioButton *toolBt6;

    QCheckBox *checkBox;
    QCommandLinkButton *commandLinkBtton;
    QDialogButtonBox *dialogButtonBox;

private slots:
   void btnToggled(bool checked);
   void btnCheck(int index);
   void openBaidu();
   void onButtonBoxClick(QAbstractButton *button);

};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QButtonGroup>
#include <QMenu>
#include<QPushButton>
#include <QDesktopServices>
#include<QUrl>
#include<QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    setGeometry(10,10,1200,1200);

    bt=new QPushButton("button",this);
    connect(bt,SIGNAL(clicked()),this,SLOT(close()));
    bt->setGeometry(10,10,200,30);

    toolButton=new QToolButton(this);
    toolButton->setGeometry(10,110,200,30);
    toolButton->setText("tool button");
    toolButton->setPopupMode(QToolButton::InstantPopup);
    QMenu *menu=new QMenu;
    QAction *open=new QAction("open");
    QAction *close=new QAction("close");
    QAction *save=new QAction("save");
    menu->addAction(open);
    menu->addAction(close);
    menu->addAction(save);
    toolButton->setMenu(menu);
    connect(open,SIGNAL(triggered()),SLOT(close()));
    connect(close,SIGNAL(triggered()),SLOT(close()));
    connect(save,SIGNAL(triggered()),SLOT(close()));

    QButtonGroup *group1=new QButtonGroup(this);
    QButtonGroup *group2=new QButtonGroup(this);
    toolBt=new QRadioButton("blue",this);
    toolBt->setGeometry(10,130,100,30);
    toolBt2=new QRadioButton("red",this);
    toolBt2->setGeometry(10,160,100,30);
    toolBt3=new QRadioButton("yellow",this);
    toolBt3->setGeometry(10,180,100,30);
    group1->addButton(toolBt,0);
    group1->addButton(toolBt2,0);
    group1->addButton(toolBt3,0);
    toolBt4=new QRadioButton("greem",this);
    toolBt4->setGeometry(10,200,100,30);
    toolBt5=new QRadioButton("black",this);
    toolBt5->setGeometry(10,220,100,30);
    toolBt6=new QRadioButton("white",this);
    toolBt6->setGeometry(10,240,100,30);
    group2->addButton(toolBt4,0);
    group2->addButton(toolBt5,0);
    group2->addButton(toolBt6,0);


    //处理事件
    connect(toolBt,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));
    connect(toolBt2,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));
    connect(toolBt3,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));
    connect(toolBt4,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));
    connect(toolBt5,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));
    connect(toolBt6,SIGNAL(clicked(bool)),this,SLOT(btnToggled(bool)));

     checkBox=new QCheckBox("checkBox",this);
     checkBox->setGeometry(10,280,100,30);
     connect(checkBox,SIGNAL(stateChanged(int)),this,SLOT(btnCheck(int)));

     commandLinkBtton=new QCommandLinkButton("baidu","baidu.com",this);
     commandLinkBtton->setGeometry(10,300,100,60);
     connect(commandLinkBtton,SIGNAL(clicked()),this,SLOT(openBaidu()));


     dialogButtonBox=new QDialogButtonBox(QDialogButtonBox::Help|QDialogButtonBox::Ok,Qt::Orientation::Vertical,this);
     dialogButtonBox->setGeometry(10,360,100,200);
     connect(dialogButtonBox,SIGNAL(accepted()),this,SLOT(close()));
     connect(dialogButtonBox,SIGNAL(helpRequested()),this,SLOT(openBaidu()));

//     Yes按钮: 产生accepted信号
//     Yes to All 按钮: 产生accepted信号
//     OK 按钮: 产生accepted信号
//     Save 按钮: 产生accepted信号
//     Save All 按钮: 产生accepted信号
//     Open 按钮: 产生accepted信号
//     Retry 按钮: 产生accepted信号
//     Ignore 按钮: 产生accepted信号
//     Discard 按钮:不产生accepted、rejected、helpRequested信号
//     No 按钮: 产生rejected信号
//     No to All 按钮: 产生rejected信号
//     Abort 按钮: 产生rejected信号
//     Close 按钮: 产生rejected信号
//     Cancel 按钮: 产生rejected信号
//     Apply、 Reset、 Restore Defaults :这三个按钮不产生accepted、rejected、helpRequested信号
//     Help 按钮: 产生helpRequested信号

}

MainWindow::~MainWindow()
{
}




void MainWindow::btnToggled(bool checked)
{
    if(checked) qDebug()<<"is cheked";
    else qDebug()<<"is uncheked";
}

void MainWindow::btnCheck(int index)
{
    if(index==0){
        qDebug()<<"is uncheked";
    }else {
        qDebug()<<"is cheked";
    }
}

void MainWindow::openBaidu()
{
    QDesktopServices::openUrl(QUrl("https://www.baidu.com/",QUrl::TolerantMode));
}

void MainWindow::onButtonBoxClick(QAbstractButton *button)
{
    if(button==dialogButtonBox->button(QDialogButtonBox::Ok)){
        qDebug()<<"is ok";
    }else if(button==dialogButtonBox->button(QDialogButtonBox::Apply)){
        qDebug()<<"is apply";
    }else if(button==dialogButtonBox->button(QDialogButtonBox::Help)){
        qDebug()<<"is help";
    }
}

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //创建主窗口
    MainWindow w;
    w.show();

    return a.exec();
}

运行效果: 布局看起来有点乱,但是本节的重点依然是如何实现五种按钮的纯代码使用。

 下一篇教程:

  二 Qt控件之四: item views

上一篇教程: Qt6教程之二(2) Spacers

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值