文章首发于我的个人博客:欢迎大佬们来逛逛
微调框,可以通过点击增加减小或者输入来调整数据。
继承自:QAbstractSpinBox
同时这个类还具有Double类型的版本。
常用操作:
可以通过重写 父类的 textFromValue
来自定义数据的类型:
class SpinBox :public QSpinBox{
public:
SpinBox(QWidget* parent=nullptr)
:QSpinBox(parent){
strs<<"NULL"<<"一"<<"二"<<"三"<<"四"<<"五"<<"六"<<"日";
}
QString textFromValue(int value)const override{
return strs[value];
}
private:
QStringList strs;
};
测试如下:
void Widget::testQSpinBox()
{
sp=new SpinBox(this);
sp->setRange(1,7);
//设置值
sp->setValue(5);
//循环
sp->setWrapping(true);
//步长
sp->setSingleStep(1);
//前缀后缀
sp->setPrefix("周");
sp->setSuffix("上学");
//特殊显示最小值
sp->setSpecialValueText("最底部!");
//显示方式:直接看到,干净的
qInfo()<<sp->text()<<sp->cleanText();
}
时间日期显示类,并且还可以自己修改时间与日期
它也继承自QAbstractSpinBox
本质是一个微调框
常用操作如下:
使用QDateTime::currentDateTime()
来获取当前时间日期。
void Widget::testQDateTimeEdit()
{
dt=new QDateTimeEdit(this);
//设置当前时间
dt->setDateTime(QDateTime::currentDateTime());
//设置显示格式
dt->setDisplayFormat("yyyy年MM月dd日-hh时mm分ss秒");
//获取某段数值
qInfo()<<dt->sectionCount()<<dt->sectionAt(2)<<dt->sectionText(dt->sectionAt(2));
//日历弹出
dt->setCalendarPopup(true);
}
如果我们要做一个钟表,即每时每刻我们的时间都要发生变化,则可以使用一个定时器来对这个控件的显示进行刷新:
QTimer* dateTimer=new QTimer(this);
dateTimer->callOnTimeout(this,&Widget::timeGoOn);
dateTimer->start(100);
...
public slots:
void Widget::timeGoOn()
{
//时间流逝
dt->setDateTime(QDateTime::currentDateTime());
}
这是一个下拉框,可以下拉选择某个内容
它继承自:QWidget
常用操作:
QComboBox::SizeAdjustPolicy
常用信号:
代码:
测试了基本功能,以及可以通过选择某个项目来获得这个项目所代表的数据内容。
void Widget::testQComboBox()
{
cbx=new QComboBox(this);
//currentData
QStringList datas{"北京","成都","济南","西安","沈阳","杭州","南京"};
QStringList itemDatas{"北京市","四川省","山东省","陕西省","辽宁省","浙江省","江苏省"};
cbx->addItems(datas);
for (int i=0;i<datas.count();i++){
cbx->setItemData(i,itemDatas[i]);
}
//获取项目映射的值
connect(cbx,&QComboBox::currentIndexChanged,this,[=](int index){
qInfo()<<"当前选择: "<<cbx->currentText()<<cbx->currentData().toString();
});
//可以编辑插入
cbx->setEditable(true);
//可以重复
//cbx->setDuplicatesEnabled(true);
//根据内容调整尺寸
cbx->setSizeAdjustPolicy(QComboBox::SizeAdjustPolicy::AdjustToContents);
return;
//基本插入函数
cbx->addItem("唱跳");
cbx->addItem("RAP");
cbx->addItem("篮球");
cbx->addItem(style()->standardIcon(QStyle::StandardPixmap::SP_DirHomeIcon),"吃鸡");
cbx->insertSeparator(4);
cbx->addItems(QStringList{"蔡徐坤","陈立农","范丞丞"});
}
这是一个滑动条。
它继承自:QAbstractSlider
,一个抽象滑动类。
同样还有QScrollBar和QDial也都是继承自QAbstractSlider
这个抽象类。
他们两个也都是滑动相关的控件。
其构造函数:
我们可以通过Qt::Orientation来指定滑动条的位置:
QSlider(Qt::Orientation orientation, QWidget *parent = nullptr)
基本函数功能:
测试代码如下:
void Widget::testQSlider()
{
//Qt::Orientation::Horizontal
sld=new QSlider(this);
sld->setGeometry(100,100,20,100);
sld->setRange(0,100);
//手动设置值
//sld->setValue(50);
connect(sld,&QSlider::valueChanged,this,[=](int value){
qInfo()<<value;
});
auto sbar=new QScrollBar(this);
sbar->resize(20,100);
auto dial=new QDial(this);
dial->setGeometry(200,200,50,50);
}
设置一个橡皮条拖拽控件。
它继承自:QWidget
具有以下的基本函数:
如何实现这个选中的功能?
我们需要用到鼠标的事件:
具体实现如下:
void Widget::mousePressEvent(QMouseEvent *ev)
{
//橡皮条拖动
origin=ev->pos(); //保存开始的位置
rband->setGeometry(QRect(origin,QSize()));
rband->show();
}
void Widget::mouseMoveEvent(QMouseEvent *ev)
{
rband->setGeometry(QRect(origin,ev->pos()).normalized());
}
void Widget::mouseReleaseEvent(QMouseEvent *ev)
{
rband->hide();
qInfo()<<rband->geometry();
}
小案例:
选中矩形区域,并且矩形区域内所有的多选框都被选中:
注意判断是否包含的条件:geometry
的contains
方法
void Widget::testQRubberBand()
{
rband=new QRubberBand(QRubberBand::Shape::Line,this);
//选中按钮
for (int i=0;i<5;i++){
for (int j=0;j<5;j++){
auto chx=new QCheckBox(QString::number(i*5+j),this);
chx->move(i*50,j*50);
}
}
}
void Widget::mousePressEvent(QMouseEvent *ev)
{
//橡皮条拖动
origin=ev->pos(); //保存开始的位置
rband->setGeometry(QRect(origin,QSize()));
rband->show();
}
void Widget::mouseMoveEvent(QMouseEvent *ev)
{
rband->setGeometry(QRect(origin,ev->pos()).normalized());
}
void Widget::mouseReleaseEvent(QMouseEvent *ev)
{
rband->hide();
qInfo()<<rband->geometry();
//处理批量点击按钮
auto lists=this->children();
for (auto& x:lists){
auto chx=dynamic_cast<QCheckBox*>(x);
if (chx && rband->geometry().contains(chx->geometry())){
chx->setChecked(!chx->isChecked());
}
}
}