第四章Qt基本控件

1.按钮

QAbstractButton(抽象类)

QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并且指定如何绘制按钮
QAbstractButton提供了点击和勾选按钮。

要子类化QAbstractButton,您至少必须重新实现paintEvent()来绘制按钮的轮廓极骑文本或像素图。

1.PushButton(按钮)

#include "Widget.h"
#include<QPushButton>
#include<QMenu>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(600,400);
    auto pushBtn = new QPushButton("按钮",this);
    pushBtn->resize(200,100);//调整按钮大小
    
    connect(pushBtn,&QPushButton::clicked,[=]{
        static int i=0;
        pushBtn->setText(QString("按下第%1次").arg(++i));//设置显示文字
        pushBtn->setIcon(QPixmap(":/C:/Users/PVer/Pictures/Resource/wendi.bmp"));//设置图标
        pushBtn->setIconSize(QSize(i,i));//设置图标大小
    });
    
    pushBtn->setShortcut(QKeySequence(tr("Ctrl+p")));//设置快捷键
    
    //设置长按,一直按着会触发点击事件(按下,弹起循环)
    pushBtn->setAutoRepeat(true);
    pushBtn ->setAutoRepeatDelay(3000);//按着3秒判定为长按
    pushBtn->setAutoRepeatInterval(500);//间隔500毫秒
    
    //给按钮设置菜单
    QMenu *menu = new QMenu;
    menu->addAction("孙悟空");
    menu->addAction("猪八戒");
    pushBtn->setMenu(menu);
    
    //设置菜单的信号和槽
    connect(menu,&QMenu::triggered,[=](QAction *act){
        qInfo()<<act->text();//输出选中的文本
    });
    
    pushBtn->setFlat(true);//去掉背景
    
}

2.工具按钮(ToolButton)

通常不显示文本标签,而是显示图标,一般用在toolBar上

#include <QToolButton>
#include <QStyle>

    auto toolBtn = new QToolButton(this);
    toolBtn->resize(100,50);
    toolBtn->setIcon(style()->standardIcon(QStyle::SP_DriveFDIcon));//设置系统提供的标准图标
    toolBtn->setText("工具按钮");//设置文本,但是不会显示,因为默认是隐藏的
    toolBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);//设置文本显示,跟在图标后
    toolBtn->setArrowType(Qt::UpArrow);//图标改成向上的箭头
    toolBtn->setMenu(menu);//设置菜单,但默认不显示,要设置
    toolBtn->setPopupMode(QToolButton::MenuButtonPopup);//设置菜单下拉按钮生效

3.单选按钮(RadioButton)

#include <QRadioButton>
    auto radioBtn1 = new QRadioButton("男",this);
    radioBtn1->move(100,100);
    auto radioBtn2 = new QRadioButton("女",this);
    radioBtn2->move(200,100);
    //radioBtn1->setCheckable(false);//设置可选中,默认是可选中(true)
    radioBtn2->setChecked(true);//设置初始已选中

4.复选框(CheckBox)

#include <QCheckBox>
    auto ckBtn1 = new QCheckBox("猫",this);
    auto ckBtn2 = new QCheckBox("狗",this);
    auto ckBtn3 = new QCheckBox("兔",this);
    ckBtn1->move(100,200);
    ckBtn2->move(200,200);
    ckBtn3->move(300,200);
    connect(ckBtn1,&QCheckBox::checkStateChanged,[=](Qt::CheckState state ){
        qInfo()<< state;//显示选中状态
    });
    ckBtn2->setCheckable(false);//设置不能选中

5.行编辑器(LineEdit)

#include <QLineEdit>
    auto lineEdt=new QLineEdit("123",this);
    lineEdt->move(120,10);
    connect(lineEdt,&QLineEdit::textChanged,[=](QString txt){
        qInfo()<<txt;//文本改变,就输出改变后的文本
    });
    connect(lineEdt,&QLineEdit::cursorPositionChanged,[=](int oldPos,int newPos){
        qInfo()<<"光标从"<<oldPos<<"移动到"<<newPos;//光标在文本里的位置改变,一个字符(中文也一样)一个位置,初始没选中是-1,光标在最前面是0
    });
    connect(lineEdt,&QLineEdit::editingFinished,[=]{
        qInfo()<<"编辑完成";//按下enter或者失去焦点,编辑即完成
        lineEdt->selectAll();//选中文本
        lineEdt->copy();//文字复制到剪贴板,如果没选中,就无效
    });
    // lineEdt->setEchoMode(QLineEdit::Password);//设置密码输入模式
    lineEdt->setEchoMode(QLineEdit::PasswordEchoOnEdit);/*编辑的时候正常,焦点离开变成小黑点 */
    lineEdt->setClearButtonEnabled(true);//后面带个×,点击可以清除已输入文字
  • 设置输入掩码
#include <QIntValidator>
#include <QDoubleValidator>
#include <QRegularExpressionValidator>
	lineEdt->setInputMask(">NNNN-NNNN-NNNN");//设置输入格式,秘钥
	lineEdt->setInputMask("9999-99-99");//设置输入格式,年月日
  
  	lineEdt->setValidator(new QIntValidator(100,999,this));//设置验证器,大于100(但是输入1位2位都可以),小于999
  	lineEdt->setValidator(new QDoubleValidator(10.0,99.1,2,this));//浮点数限定,最小10.0,最大设置好像无效
    lineEdt->setValidator(new QRegularExpressionValidator(QRegularExpression("[1-9]\\d{7,10}@qq\\.com")));//QQ邮箱正则
    lineEdt->addAction(QPixmap(":/C:/Users/PVer/Pictures/Resource/wendi.bmp"),QLineEdit::LeadingPosition);//在左边添加一个温迪的图标

6.标签(Label)

#include <QLabel>
    auto lab = new QLabel;
    lab->show();
    lab->resize(400,300);
    lab->move(200,100);
    lab->setWindowTitle("lable");
    lab->setPixmap(QPixmap(":/C:/Users/PVer/Pictures/Resource/wendi.bmp"));
    lab->setScaledContents(true);//让图片填满控件,进行缩放
   
    lab->setText("谁谁谁ggggggggggggggggg");
    lab->setAlignment(Qt::AlignCenter);//设置对齐方式,居中
    lab->setFixedWidth(10);//设置固定宽度
    lab->setWordWrap(true);//设置自动换行
    lab->setText("<a href=\"www.csdn.net\">csdn</a>");//可以设置超链接,需要通过信号处理
    connect(lab,&QLabel::linkHovered,[]{
        qInfo()<<"www.csdn.net";
    });//鼠标悬停
    connect(lab,&QLabel::linkActivated,[]{
        qInfo()<<"正在打开网页...";
    });

    //设置动画并播放
    auto mov = new QMovie(":/C:/Users/PVer/Pictures/Resource/zhutou.gif");
    lab->setMovie(mov);
    mov->start();

设置伙伴

#include <QGridLayout>
    QLabel* nameLabel= new QLabel("&Name姓名",this);//&后面跟英文字母,可以用快捷键alt+N快速切换到绑定的lineEdit
    QLineEdit* nameEdit = new QLineEdit;
    nameLabel->setBuddy(nameEdit);

    QLabel* phoneLabel= new QLabel("电话(&P)",this);
    QLineEdit* phoneEdit = new QLineEdit;
    phoneLabel->setBuddy(phoneEdit);

    QGridLayout* gLayout= new QGridLayout;
    gLayout->addWidget(nameLabel,0,0);
    gLayout->addWidget(nameEdit,0,1);
    gLayout->addWidget(phoneLabel,1,0);
    gLayout->addWidget(phoneEdit,1,1);

    auto w = new  QWidget;
    w->setLayout(gLayout);
    w->show();

7.分组框(GroupBox)

#include <QGroupBox>
    QGroupBox* box=new QGroupBox("box",this);
    box->move(300,0);
    QGroupBox* box1=new QGroupBox("box1",this);
    box1->move(400,0);
    auto radioBtn3 = new QRadioButton("公");
    auto radioBtn4 = new QRadioButton("母");
    QVBoxLayout* v1= new QVBoxLayout(box);
    QVBoxLayout* v2= new QVBoxLayout(box1);
    v1->addWidget(radioBtn1);
    v1->addWidget(radioBtn2);
    v2->addWidget(radioBtn3);
    v2->addWidget(radioBtn4);
04-06 01:13