第四章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);