【QT】4.QWidget控件(2)

目录

[1. QPushButton](#1. QPushButton)

[1.1 设置图标](#1.1 设置图标)

[1.2 设置快捷键](#1.2 设置快捷键)

[1.3 鼠标设置连点](#1.3 鼠标设置连点)

[2. RadioButton](#2. RadioButton)

[2.1 autoexclusive](#2.1 autoexclusive)

[2.2 将小料的autoexclusive给熄灭](#2.2 将小料的autoexclusive给熄灭)

[2.3 信号](#2.3 信号)

[3. Checkbox](#3. Checkbox)

[4. QLabel](#4. QLabel)

[4.1 设置图片](#4.1 设置图片)

[4.2 调整位置](#4.2 调整位置)

[4.3 调整方位](#4.3 调整方位)

[4.4 设置伙伴](#4.4 设置伙伴)

[5. LCDNumber](#5. LCDNumber)

[6. ProgressBar](#6. ProgressBar)

[7. QCalendarWidget](#7. QCalendarWidget)

[8. LineEdit](#8. LineEdit)

密码输入相同激活按钮

[9. TextEdit](#9. TextEdit)

[10. ComboBox](#10. ComboBox)

[11. SpinBox](#11. SpinBox)

[12. DateTimeEdit](#12. DateTimeEdit)

[13. QDial](#13. QDial)

[14. QSlider](#14. QSlider)

设快捷键

[15. 多元控件](#15. 多元控件)

[16. ListWidget](#16. ListWidget)

[17. TableWidget](#17. TableWidget)

[18. QGroupBox](#18. QGroupBox)

[19. QTabWidget](#19. QTabWidget)

[20. QBoxLayout](#20. QBoxLayout)

[21. QGridLayout](#21. QGridLayout)

伸缩尺寸


1. QPushButton

1.1 设置图标

复制代码
ui->pushButton->setIcon(QIcon(":/tu.png"));
ui->pushButton->setIconSize(QSize(80, 80));

在构造函数里设置icon对象

1.2 设置快捷键

快捷键的对象为QKeySequence

复制代码
ui->pushButton->setShortcut(QKeySequence(" "));

也可以两个快捷键拼在一起

复制代码
ui->pushButton->setShortcut(QKeySequence("ctrl+ "));

还可以使用枚举值

复制代码
ui->pushButton->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Space));

1.3 鼠标设置连点

cpp

复制代码
ui->pushButton->setAutoRepeat(1);

2. RadioButton

可以选择的按钮

2.1 autoexclusive

所有按钮默认只能单选,如果要多选,就将打开的autoexclusive给关掉。

模拟点餐程序:

主菜3选1,小料可以多选

2.2 将小料的autoexclusive给熄灭

由于只支持单/多选,因此需要给按钮分组

复制代码
QButtonGroup* q1 = new QButtonGroup(this);
QButtonGroup* q2 = new QButtonGroup(this);
QButtonGroup* q3 = new QButtonGroup(this);

q1->addButton(ui->radioButton);
q1->addButton(ui->radioButton_2);
q1->addButton(ui->radioButton_3);

q2->addButton(ui->radioButton_4);
q2->addButton(ui->radioButton_5);
q2->addButton(ui->radioButton_6);

q3->addButton(ui->radioButton_7);
q3->addButton(ui->radioButton_8);
q3->addButton(ui->radioButton_9);

这样就能运行了

2.3 信号

Clicked和toggled

Clicked只要点击就会发出信号

而toggled是状态变化发出信号

3. Checkbox

默认可以多选的radio button

简单的任务表

cpp

复制代码
void Widget::on_pushButton_clicked()
{
    QString s1 = "你今天干什么:";
    
    if(ui->checkBox->isChecked())
    {
        s1 = s1 + ui->checkBox->text() + " ";
    }
    if(ui->checkBox_2->isChecked())
    {
        s1 = s1 + ui->checkBox_2->text() + " ";
    }
    if(ui->checkBox_3->isChecked())
    {
        s1 = s1 + ui->checkBox_3->text();
    }
    
    ui->label->setText(s1);
}

4. QLabel

4.1 设置图片

cpp

复制代码
QRect w = this->geometry();
ui->label->setGeometry(0, 0, w.width(), w.height());

QPixmap p1(":/a.png");
ui->label->setPixmap(p1);
ui->label->setScaledContents(1);

setScaledContents:将照片拉伸铺满对应控件,这样,图片就能铺满窗口

但是,之后调节窗口大小,照片不会一起动,因为放在构造函数里

可以修改父类的resizeevent的事件,构成多态,以修改窗口大小时会自动调整大小

cpp

复制代码
void Widget::resizeEvent(QResizeEvent *event)
{
    ui->label->setGeometry(0, 0, event->size().width(), event->size().height());
}

4.2 调整位置

cpp

复制代码
ui->label->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);

设置成正中间

4.3 调整方位

  • setWordWrap:设置换行

  • setIndent:设置缩进(每行)

  • setMargin:设置页边距

4.4 设置伙伴

cpp

复制代码
ui->label->setBuddy(ui->radioButton);
ui->label_2->setBuddy(ui->radioButton_2);

在label写&b就代表将快捷键设置为b

5. LCDNumber

设置10秒倒计时

cpp

复制代码
ui->lcdNumber->display("10");

QTimer* q1 = new QTimer(this);
connect(q1, &QTimer::timeout, this, &Widget::handle);
q1->start(1000);

QTimer为Qt的倒计时组件,设置多少ms发出信号并关联到槽函数

cpp

复制代码
void Widget::handle()
{
    int t = ui->lcdNumber->intValue();
    if(t == 0)
    {
        q1->stop();
        return;
    }
    t--;
    ui->lcdNumber->display(t);
}

槽函数控制数的显示

6. ProgressBar

进度条

cpp

复制代码
t1 = new QTimer(this);
t1->start(100);
connect(t1, &QTimer::timeout, this, &Widget::handle);

void Widget::handle()
{
    int s = ui->progressBar->value();
    if(s == 100)
    {
        t1->stop();
        return;
    }
    s++;
    ui->progressBar->setValue(s);
}

同样关联时间信号和槽函数

由于Qt有统一前置声明所有类的机制,因此头文件在.cpp包也可以,这是为了加快编译速度

7. QCalendarWidget

日历

cpp

复制代码
void Widget::on_calendarWidget_selectionChanged()
{
    QDate d1 = ui->calendarWidget->selectedDate();
    ui->label->setText(d1.toString());
}

显示点击日期

QDate为日期类,d1.toString()可以转为字符串

8. LineEdit

设置信息输入

要求电话输入符合格式要求,并且信息全部填入才可以按下确认键

cpp

复制代码
QRegExp q1("^1\\d{10}$");
ui->lineEdit_phone->setValidator(new QRegExpValidator(q1));

正则表达式:

  • ^1:开头是1

  • \\d:整数,由于C++,因此要加转义字符

  • {10}:前面的\\d重复10次

  • $:结尾

cpp

复制代码
bool Widget::check()
{
    bool f1 = ui->checkBox->checkState();
    bool f2 = ui->checkBox_2->checkState();
    bool fl = 0;
    if((f1 == 1 && f2 == 0) || (f2 == 1 && f1 == 0)) 
        fl = 1;
    
    const QString& s1 = ui->lineEdit_name->text();
    QString s2 = ui->lineEdit_phone->text();
    int pos = 0;
    bool f = ui->lineEdit_phone->validator()->validate(s2, pos);
    
    if(fl && f && s1.size())
    {
        ui->pushButton->setEnabled(1);
    }
    else
    {
        ui->pushButton->setEnabled(0);
    }
}

void Widget::on_pushButton_clicked()
{
    qDebug() << "成功输入";
}

void Widget::on_lineEdit_name_textEdited(const QString &arg1)
{
    check();
}

void Widget::on_lineEdit_phone_textEdited(const QString &arg1)
{
    check();
}

void Widget::on_checkBox_toggled(bool checked)
{
    check();
}

void Widget::on_checkBox_2_toggled(bool checked)
{
    check();
}

当任何组件变化,都调用check判断函数

密码输入相同激活按钮

cpp

复制代码
ui->lineEdit->setPlaceholderText("请输入密码");
ui->lineEdit_2->setPlaceholderText("请再次输入密码");
ui->lineEdit->setClearButtonEnabled(1);
ui->lineEdit_2->setClearButtonEnabled(1);
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
  • setPlaceholderText:设置输入提示

  • setClearButtonEnabled:多出清空按钮

  • setEchoMode:显示为专门的密码显示模式

cpp

复制代码
void Widget::checked()
{
    QString s1 = ui->lineEdit->text();
    QString s2 = ui->lineEdit_2->text();
    
    if(s1.size() && s2.size() && s1 == s2)
    {
        ui->pushButton->setEnabled(1);
    }
}

void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    checked();
}

void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
    checked();
}

同样有变化就会检查

9. TextEdit

可以用html/markdown格式

信号:

  • textChanged:文本变化

  • selectionChanged:选择变化

  • cursorPositionChanged:光标位置变化

  • undoAvailable:撤销

  • redoAvailable:重做

10. ComboBox

下拉选框

cpp

复制代码
ui->comboBox->addItem("1");

右键编辑项目添加选项

从文件读取选项:

cpp

复制代码
std::fstream f("D:\\cdoee\\code\\QT\\4widget2\\test.txt");
std::string s;
while(getline(f, s))
{
    ui->comboBox->addItem(QString(QString::fromStdString(s)));
}

fromStdString函数可以将string转为QString

11. SpinBox

调整数量的输入框

cpp

复制代码
ui->spinBox->setRange(1, 5);
ui->spinBox->setValue(1);

设置范围,默认值

可以有范围选择

12. DateTimeEdit

显示时间的按钮

日期计算器

cpp

复制代码
QDateTime t2 = ui->dateTimeEdit->dateTime();
QDateTime t1 = ui->dateTimeEdit_2->dateTime();

int d = t1.daysTo(t2);
int s = t1.secsTo(t2);
s = s / 3600 % 24;

ui->label->setText(QString("间隔") + QString(QString::number(d)) + 
                   QString("天") + QString(QString::number(s)) + QString("小时"));

按下按钮计算时间间隔

  • daysTo:计算天数

  • secsTo:计算秒数

13. QDial

旋钮

  • NotchVisible:显示刻度

  • Wrapping:是否允许转到中间

设置透明度

cpp

复制代码
void Widget::on_dial_valueChanged(int value)
{
    this->setWindowOpacity((double)value / 100);
}

由于透明度是0~1的小数,因此/100

14. QSlider

  • setMinimum:最小值

  • setMaximum:最大值

  • setValue:设置值

  • setSingleStep:一次调节多少

两个滑块调节窗口

cpp

复制代码
void Widget::on_horizontalSlider_valueChanged(int value)
{
    const QRect& q = this->geometry();
    this->setGeometry(q.x(), q.y(), value, q.height());
}

void Widget::on_verticalSlider_valueChanged(int value)
{
    const QRect& q = this->geometry();
    this->setGeometry(q.x(), q.y(), q.width(), value);
}

设快捷键

cpp

复制代码
ui->setupUi(this);

QShortcut* add = new QShortcut(this);
add->setKey(QKeySequence("+"));

QShortcut* sub = new QShortcut(this);
sub->setKey(QKeySequence("-"));

connect(add, &QShortcut::activated, this, &Widget::addfunc1);
connect(sub, &QShortcut::activated, this, &Widget::addfunc2);

快捷键类指定信号函数、编写槽函数调整对应值

cpp

复制代码
void Widget::addfunc1()
{
    int a = ui->verticalSlider->value();
    ui->verticalSlider->setValue(a + 50);
}

void Widget::addfunc2()
{
    int a = ui->verticalSlider->value();
    ui->verticalSlider->setValue(a - 50);
}

15. 多元控件

  • ......View:更底层

  • ......Widget:为......View的封装

  • ......View为MVC结构的实现

M:数据 C:控制器 V:视图

......View需要自己实现M,C部分

16. ListWidget

类似于备忘录

  • addItem:添加元素

  • currentRow:获取停留的行

  • takeItem:删除

cpp

复制代码
void Widget::on_pushButton_clicked()
{
    QString s = ui->lineEdit->text();
    ui->listWidget->addItem(s);
}

void Widget::on_pushButton_2_clicked()
{
    int r = ui->listWidget->currentRow();
    ui->listWidget->takeItem(r);
}

添加,删除备忘录

17. TableWidget

简易表格

  • rowCountcolumnCount:获取行列数据

  • insertRowinsertColumn:插入行列

  • setHorizontalHeaderItem:设置表头

复制代码
void Widget::on_pushButton_clicked()  // 新增行
{
    int cow = ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(cow);
}

void Widget::on_pushButton_2_clicked()  // 新增列
{
    int col = ui->tableWidget->columnCount();
    ui->tableWidget->insertColumn(col);
    
    const QString& str = ui->lineEdit->text();
    ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(str));
}

void Widget::on_pushButton_3_clicked()  // 删除行
{
    int row = ui->tableWidget->currentRow();
    ui->tableWidget->removeRow(row);
}

void Widget::on_pushButton_4_clicked()  // 删除列
{
    int col = ui->tableWidget->currentColumn();
    ui->tableWidget->removeColumn(col);
}

18. QGroupBox

将控件放成一组,简洁化界面,更好管理

19. QTabWidget

容器类控件

标签页

复制代码
void Widget::on_pushButton_clicked()
{
    int count = ui->tabWidget->count();
    QWidget* w = new QWidget();
    ui->tabWidget->addTab(w, QString("tab") + QString::number(count + 1));
    
    QLabel* label = new QLabel(w);
    label->setText(QString("标签页") + QString::number(count + 1));
    label->resize(100, 50);
    
    ui->tabWidget->setCurrentIndex(count);
}

void Widget::on_pushButton_2_clicked()
{
    int index = ui->tabWidget->currentIndex();
    ui->tabWidget->removeTab(index);
}

增删标签页

setCurrentIndex(count):设置光标选择的页

20. QBoxLayout

代码放置组件

复制代码
QPushButton* b = new QPushButton(this);
QVBoxLayout* lay = new QVBoxLayout();
lay->addWidget(b);

放置按钮

和QHBoxLayout组合

复制代码
QVBoxLayout* lay = new QVBoxLayout();
this->setLayout(lay);

QPushButton* b1 = new QPushButton(this);
QPushButton* b2 = new QPushButton(this);
QPushButton* b3 = new QPushButton(this);
QPushButton* b4 = new QPushButton(this);

lay->addWidget(b1);
lay->addWidget(b2);

QHBoxLayout* lay2 = new QHBoxLayout();
lay2->addWidget(b3);
lay2->addWidget(b4);

lay->addLayout(lay2);

将水平和垂直放置组合形成图案

21. QGridLayout

网格摆放

复制代码
lay->addWidget(q1, 0, 0);
lay->addWidget(q2, 0, 1);
lay->addWidget(q3, 0, 2);
lay->addWidget(q4, 1, 0);
lay->addWidget(q5, 1, 1);
lay->addWidget(q6, 1, 2);

伸缩尺寸

cpp

复制代码
lay->setColumnStretch(0, 0);
lay->setColumnStretch(1, 1);
lay->setColumnStretch(2, 2);

第一个数字指定列

第二个数字:0表示不伸缩,1,2表示比例

行伸缩

由于按钮默认列不伸缩

修改:

cpp

复制代码
q1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
q2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
q3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

列伸缩:

cpp

复制代码
lay->setRowStretch(0, 1);
相关推荐
端平入洛18 小时前
auto有时不auto
c++
哇哈哈20212 天前
信号量和信号
linux·c++
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马2 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝2 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
weiabc2 天前
printf(“%lf“, ys) 和 cout << ys 输出的浮点数格式存在细微差异
数据结构·c++·算法
问好眼2 天前
《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
c++·算法·位运算·信息学奥赛
yyjtx2 天前
DHU上机打卡D31
开发语言·c++·算法
czxyvX2 天前
020-C++之unordered容器
数据结构·c++
会编程的土豆2 天前
2.25 做题
数据结构·c++·算法