Qt常用控件 输入类控件
文章目录
- 1.QLineEdit
- 1.1 常用属性
- 1.2 常用信号
- 1.3 例子1,录入用户信息
- 1.4 例子2,正则验证手机号
- 1.5 例子3,验证输入的密码
- 1.6 例子4,显示密码
- 2. QTextEdit
- 2.1 常用属性
- 2.2 常用信号
- 2.3 例子1,获取输入框的内容
- 2.4 例子2,使用各种信号
- 3. QComboBox
- 2.1 常用属性和方法
- 2.2 常用信号
- 2.3 例子1,点餐
- 2.4 例子2,从文件读取内容
- 4. QSpinBox
- 4.1 常用属性
- 4.2 常用信号
- 4.3 例子1,饮料个数
- 5. QDateTimeEdit
- 4.1 常用属性
- 4.2 常用信号
- 4.3 例子1,计算年龄
- 6. QDial
- 6.1 常用属性
- 6.2 常用信号
- 6.3 例子1,调整窗口不透明度
- 7. QSlider
- 7.1 常用属性
- 7.2 常用信号
- 7.3 例子1,调整窗口大小
- 7.3 例子2,快捷键调整
1.QLineEdit
QLineEdit
表示单行输入框
1.1 常用属性
属性 | 说明 |
---|---|
text | 输入框中的文本内容,可用于获取或设置当前显示的文本。 |
inputMask | 对输入内容的格式进行约束,规定用户只能按照特定的格式输入文本,例如限制输入日期、电话号码等格式。 |
maxLength | 输入框允许输入的最大长度,当输入的文本达到该长度后,用户将无法继续输入更多字符。 |
frame | 控制是否为输入框添加边框,设置为 true 显示边框,false 则不显示。 |
echoMode | 控制输入框中文本的显示方式,有以下几种模式: - QLineEdit::Normal :默认模式,输入框会正常显示输入的文本。 - QLineEdit::Password :输入的字符会被隐藏,通常用星号(* )或等号(= )代替,常用于密码输入场景。 - QLineEdit::NoEcho :输入框不会显示任何输入的字符。 |
cursorPosition | 表示光标在输入框中的位置,位置从 0 开始计数,可用于获取或设置光标的位置。 |
alignment | 设置输入框内文字的对齐方式,可同时设置水平和垂直方向的对齐,例如左对齐、右对齐、居中对齐等。 |
dragEnabled | 控制是否允许对输入框中的文本进行拖拽操作,设置为 true 允许,false 则禁止。 |
readOnly | 控制输入框是否为只读状态,设置为 true 时,输入框内容不可修改,用户只能查看;false 时可正常编辑。 |
placeHolderText | 当输入框内容为空时,显示的提示信息,用于引导用户输入相应内容。 |
clearButtonEnabled | 控制输入框是否会自动显示 “清除按钮”,设置为 true 显示,点击该按钮可清空输入框内容;false 则不显示。 |
1.2 常用信号
信号 | 说明 |
---|---|
void cursorPositionChanged(int old, int new) | 当鼠标移动(更准确地说是光标位置改变)时发出此信号。old 表示光标先前的位置,new 表示光标新的位置。 |
void editingFinished() | 当按下返回键或者回车键,或者行编辑框失去焦点时,发出此信号。通常用于在用户完成一次输入操作后执行相应逻辑。 |
void returnPressed() | 当按下返回键或回车键时发出此信号。如果设置了验证器,必须要验证通过才能触发该信号,可用于在用户按下回车键提交输入时进行处理。 |
void selectionChanged() | 当选中的文本发生改变时,发出此信号。可用于实现与文本选择状态相关的功能,如根据选中内容更新操作按钮状态。 |
void textChanged(const QString &text) | 当 QLineEdit 中的文本改变时,发出此信号,text 是新的文本内容。代码对文本的修改也能够触发这个信号,适用于实时响应文本变化的场景。 |
void textEdited(const QString &text) | 当 QLineEdit 中的文本改变时,发出此信号,text 是新的文本内容。但代码对文本的修改不能触发这个信号,主要用于区分用户手动编辑和代码修改文本的情况。 |
1.3 例子1,录入用户信息
在Qt Designer
中设置基本框架
widget.cpp
核心代码如下
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置nameui->lineEdit_name->setPlaceholderText("请输入姓名");ui->lineEdit_name->setClearButtonEnabled(true);// 设置phoneui->lineEdit_phone->setPlaceholderText("请输入电话");ui->lineEdit_phone->setClearButtonEnabled(true);ui->lineEdit_phone->setInputMask("000-0000-0000"); // 0表示数字, 也可以是其它数字// 设置passwordui->lineEdit_password->setPlaceholderText("请输入密码");ui->lineEdit_password->setClearButtonEnabled(true);ui->lineEdit_password->setEchoMode(QLineEdit::Password);
}void Widget::on_pushButton_clicked()
{QString gender = ui->radioButton_male->isChecked() ? "男" : "女";qDebug() << ui->lineEdit_name->text() << ' '<< gender << ' '<< ui->lineEdit_phone->text() << ' '<< ui->lineEdit_password->text();
}
点击提交后,将结果打印到控制台上
1.4 例子2,正则验证手机号
const QValidator *QLineEdit::validator() const
是 QLineEdit
类中的一个成员函数:
该函数的主要功能是获取当前 QLineEdit
控件所使用的验证器对象的指针
QValidator::State QValidator::validate(QString &input, int &pos) const
是 QValidator
类中的一个纯虚函数,QValidator
是 Qt 中用于验证用户输入的基类,该函数用于对输入的字符串进行验证,并根据验证结果返回相应的状态。:
- 返回值
QValidator::State
是一个枚举类型,用于表示验证的结果,有以下三种取值:QValidator::Invalid
:表示输入无效,不符合验证规则。QValidator::Intermediate
:表示输入处于中间状态,部分符合验证规则,但还不完整或需要进一步输入才能确定是否有效。QValidator::Acceptable
:表示输入完全有效,符合验证规则。
- 参数:
QString &input
:这是一个引用类型的参数,代表需要进行验证的输入字符串。在验证过程中,函数可能会修改这个字符串,使其符合验证规则。int &pos
:同样是引用类型的参数,代表输入字符串中光标的位置。在验证过程中,函数可能会调整光标的位置。
设置一个输入框,使用正则表达式验证该手机号。在Qt Designer
中设置基本框架
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setClearButtonEnabled(true);ui->lineEdit->setPlaceholderText("请输入手机号");// 创建一个正则表达式对象QRegExp reg("^1(3[0-9]|5[0-3,5-9]|7[1-3,5-8]|8[0-9])\\d{8}$");// 给lineEdit注册一个validatorui->lineEdit->setValidator(new QRegExpValidator(reg));
}Widget::~Widget()
{delete ui;
}void Widget::on_lineEdit_textChanged(const QString &text)
{// 获取验证器const QValidator* validator = ui->lineEdit->validator();QString non_const_text = text; // validate的第一个参数要求是非const的int pos = 0;// 判断验证是否通过if(validator->validate(non_const_text, pos) == QValidator::Acceptable) {ui->pushButton->setEnabled(true);} else {ui->pushButton->setEnabled(false);}
}
不能键入不正确的手机号。何时为一个合法的手机号,何时按钮可用
1.5 例子3,验证输入的密码
在Qt Designer
中设置基本框架
设置槽函数
void Widget::check()
{const QString s1 = ui->lineEdit->text();const QString s2 = ui->lineEdit_2->text();if(s1.isEmpty() || s2.isEmpty()) {const QString set_text = (s2.isEmpty() ? "确认密码为空" : "密码为空");ui->label->setText(set_text);} else if(s1 != s2) {ui->label->setText("两次输入的密码不一致");} else {ui->label->setText("密码匹配成功");}
}void Widget::on_lineEdit_textChanged(const QString &arg1)
{(void) arg1;check();
}void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{(void) arg1;check();
}
1.6 例子4,显示密码
在Qt Designer
中设置基本框架
设置槽函数
void Widget::on_checkBox_stateChanged(int state)
{if(state == Qt::Checked) {ui->lineEdit->setEchoMode(QLineEdit::Normal);} else {ui->lineEdit->setEchoMode(QLineEdit::Password);}
}
2. QTextEdit
QTextEdit
表示多行输入框
2.1 常用属性
属性 | 说明 |
---|---|
plainText | 当前文本内容(以纯文本形式)。获取当前文本内容(纯文本格式)使用的是toPlainText() |
markdown | 输入框内持有的内容,支持 Markdown 格式,能够自动将 Markdown 文本渲染成 HTML。toMarkdown() 获取内容 |
html | 输入框内持有的内容,可以支持大部分 HTML 标签,包括 img 和 table 等。toHtml() 获取内容 |
placeHolderText | 输入框为空时提示的内容 |
readOnly | 控制输入框是否为只读状态 |
undoRedoEnable | 控制是否开启 Undo/Redo 功能。按下 Ctrl + Z 触发 Undo,按下 Ctrl + Y 触发 Redo |
autoFormating | 控制是否开启自动格式化 |
tabstopWidth | 按下 Tab 键时缩进所占的空间大小 |
overwriteMode | 控制是否开启覆盖写模式 |
acceptRichText | 控制是否接收富文本内容 |
verticalScrollBarPolicy | 垂直方向滚动条的出现策略: - Qt::ScrollBarAsNeeded :根据内容自动决定是否需要滚动条(默认值) - Qt::ScrollBarAlwaysOff :总是关闭滚动条 - Qt::ScrollBarAlwaysOn :总是显示滚动条 |
horizontalScrollBarPolicy | 水平方向滚动条的出现策略: - Qt::ScrollBarAsNeeded :根据内容自动决定是否需要滚动条(默认值) - Qt::ScrollBarAlwaysOff :总是关闭滚动条 - Qt::ScrollBarAlwaysOn :总是显示滚动条 |
2.2 常用信号
信号 | 说明 |
---|---|
textChanged() | 当 QTextEdit 中的文本内容发生改变时触发该信号,可用于实时监测文本内容的变化,例如在用户输入或删除文本时做出响应。 |
selectionChanged() | 当文本的选中范围发生改变时触发此信号,比如用户选中新的文本区域或者取消已选的文本区域,可利用该信号实现与文本选择相关的功能。 |
cursorPositionChanged() | 光标在 QTextEdit 中移动时触发该信号,可用于实现一些依赖光标位置的操作,如显示光标所在的行号和列号等。 |
undoAvailable(bool) | 当可以进行 Undo(撤销)操作时触发此信号,参数 bool 表示是否可以进行撤销操作,true 表示可以,false 表示不可以,可据此更新撤销操作相关的界面元素状态。 |
redoAvailable(bool) | 当可以进行 Redo(重做)操作时触发此信号,参数 bool 表示是否可以进行重做操作,true 表示可以,false 表示不可以,可用于更新重做操作相关的界面元素状态。 |
copyAvailable(bool) | 文本被选中或取消选中时触发该信号,参数 bool 表示是否有文本被选中,true 表示有文本被选中,此时可以进行复制操作,false 表示无文本被选中,可用于控制复制功能相关的界面元素的可用性。 |
2.3 例子1,获取输入框的内容
在Qt Designer
中设置基本框架,一个QLabel和一个QTextEdit
给QTextEdit设置一个槽函数
void Widget::on_textEdit_textChanged()
{QString text = ui->textEdit->toPlainText();ui->label->setTextFormat(Qt::MarkdownText);ui->label->setText(text);
}
2.4 例子2,使用各种信号
在在Qt Designer
中拖入一个QTextEdit。设置槽函数
void Widget::on_textEdit_selectionChanged()
{// 得到当前可见的光标const QTextCursor cursor = ui->textEdit->textCursor();qDebug() << "selectionChanged: "<< cursor.selectedText();
}
void Widget::on_textEdit_cursorPositionChanged()
{const QTextCursor cursor = ui->textEdit->textCursor();qDebug() << "cursorPositionChanged: "<< cursor.position();
}
void Widget::on_textEdit_undoAvailable(bool b)
{qDebug() << "undoAvailable: "<< b;
}void Widget::on_textEdit_redoAvailable(bool b)
{qDebug() << "redoAvailable: "<< b;
}
当输入内容时:undoAvailable
为true
,点击撤销后,undoAvailable
为false
,redoAvailable
为true
,点击反撤销后,redoAvailable
为false
,undoAvailable
为true
。
void Widget::on_textEdit_copyAvailable(bool b)
{qDebug() << "copyAvailable: "<< b;
}
当选中内容时,copyAvailable
为true
。
3. QComboBox
QComboBox
表示下拉框
2.1 常用属性和方法
属性
属性 | 说明 |
---|---|
currentText | 表示当前在 QComboBox 中被选中的文本内容。通过这个属性可以获取用户当前选择的具体文本信息。 |
currentIndex | 当前被选中条目的下标,下标从 0 开始计数。若当前没有任何条目被选中,该属性的值为 -1。可用于定位当前选中项在下拉列表中的位置。 |
editable | 控制 QComboBox 是否允许用户对显示的文本进行修改。当设置为 true 时,QComboBox 的行为与 QLineEdit 类似,用户可以直接在输入框中编辑文本,同时也可以为其设置验证器(validator )来限制输入内容的格式。 |
iconSize | 用于设置下拉框图标(通常是小三角图标)的大小。可以根据界面设计需求调整该图标的尺寸。 |
maxCount | 规定了 QComboBox 下拉列表中最多允许存在的条目数量。当添加的条目数量达到该上限时,将无法再添加更多条目。 |
方法
方法 | 说明 |
---|---|
addItem(const QString&) | 向 QComboBox 的下拉列表中添加一个新的条目,参数为要添加条目的文本内容。 |
currentIndex() | 获取当前被选中条目的下标,下标从 0 开始计数。如果当前没有任何条目被选中,该方法返回 -1。 |
currentText() | 获取当前被选中条目的文本内容。 |
2.2 常用信号
信号 | 说明 |
---|---|
activated(int) activated(const QString &text) | 当用户选择了一个选项时发出。这里的 “选择” 指用户点开下拉框,并且鼠标划过某个选项,但此时用户还未确认做出选择。activated(int) 信号会传递选中选项的索引(从 0 开始计数),activated(const QString &text) 信号会传递选中选项的文本内容。 |
currentIndexChanged(int) currentIndexChanged(const QString &text) | 当前选项改变时发出。意味着用户已经明确地选择了一个选项,无论是通过用户手动操作(如鼠标点击、键盘选择等),还是通过程序代码修改当前选项,都会触发这个信号。currentIndexChanged(int) 传递改变后选项的索引,currentIndexChanged(const QString &text) 传递改变后选项的文本内容。 |
editTextChanged(const QString &text) | 当编辑框中的文本改变时发出,该信号仅在 editable 属性为 true 时有效。也就是当 QComboBox 处于可编辑状态,用户对输入框内的文本进行编辑修改时,会触发此信号,信号传递当前编辑框内的文本内容。 |
2.3 例子1,点餐
在Qt Designer
中设置基本框架
既可以在代码中设置,也可以在Qt Designer
中设置下拉框中的条目。右键->编辑项目->编辑组合框->点击+号,添加各种条目
添加一个按钮,给按钮添加槽函数
void Widget::on_pushButton_clicked()
{qDebug() << ui->comboBox->currentText() << ' '<< ui->comboBox_2->currentText() << ' '<< ui->comboBox_3->currentText() << ' ';
}
2.4 例子2,从文件读取内容
当前目录下有一个food.txt
在Qt Designer
中设置基本框架
widget.cpp
代码如下
#include "widget.h"
#include "ui_widget.h"
#include <fstream>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);std::string content;if(readFile("D:/bit/QT/QTPro/25_1_30QComboBox_2/food.txt", &content) == true) {QString str = QString::fromStdString(content); // 转成QStringQStringList list = str.split("\r\n"); // 切割, 转成QStringListlist.removeLast(); // 删除最后一个空元素ui->comboBox->addItems(list);}
}Widget::~Widget()
{delete ui;
}bool Widget::readFile(std::string path, std::string *outStr)
{std::ifstream file(path, std::ios::binary);if(!file) {qDebug() << "Open file error!";printf("why: %s\n", strerror(errno));return false;}file.seekg(0, std::ios::end);int fileSize = file.tellg(); // 得到文件的大小file.seekg(0);outStr->resize(fileSize);file.read((char*)outStr->c_str(), fileSize); // 读取文件内容到outStr中file.close();return true;
}
4. QSpinBox
QSpinBox
或者QDoubleSpinBox
表示微调框
4.1 常用属性
属性 | 说明 |
---|---|
value | 存储的数值,代表 QSpinBox 当前显示的数值。 |
singleStep | 每次调整的 “步长”,即按下一次按钮(上下箭头等)数据变化的量。 |
displayInteger | 数字的进制,例如设置为 10 则按照 10 进制表示,设置为 2 则为 2 进制表示。 |
minimum | 允许输入的最小值,输入的值不能小于该值。 |
maximum | 允许输入的最大值,输入的值不能大于该值。可以使用setRange(int min, int max) 同时设置最大值和最小值 |
suffix | 后缀,会显示在数值的后面,可用于表示单位等信息。 |
prefix | 前缀,会显示在数值的前面,可用于添加特定标识。 |
wrapping | 是否允许换行,若设置为 true ,当达到最大值时再增加会回到最小值,达到最小值时再减小会回到最大值。 |
frame | 是否带边框,设置为 true 显示边框,false 则不显示。 |
alignment | 文字对齐方式,可设置水平和垂直方向的对齐,例如左对齐、右对齐、居中对齐等。 |
readOnly | 是否允许修改,设置为 true 时,用户无法直接修改输入框内的数值,只能通过按钮进行调整;false 时可正常编辑。 |
buttonSymbol | 按钮上的图标样式,有以下几种取值: - UpDownArrows :上下箭头形式。 - PlusMinus :加减号形式。 - NoButtons :没有按钮。 |
accelerated | 按下按钮时是否为快速调整模式,设置为 true 时,长按按钮数值会快速变化。 |
correctionMode | 输入有误时的修正方式,有以下两种取值: - QAbstractSpinBox::CorrectToPreviousValue :如果用户输入了一个无效的值,SpinBox 会恢复为上一个有效值。 - QAbstractSpinBox::CorrectToNearestValue :如果用户输入了一个无效的值,SpinBox 会恢复为最接近的有效值。 |
keyboardTrack | 是否开启键盘跟踪,设置为 true 时,每次在输入框输入一个数字,都会触发一次 valueChanged() 和 textChanged() 信号;设置为 false 时,只有在最终按下 Enter 或者输入框失去焦点,才会触发这两个信号。 |
4.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
textChanged(QString) | 文本框内容发生任何变化时触发(无论输入是否合法或最终值是否改变)。 | QString 类型,代表当前微调框显示的完整文本,包含前缀、数值和后缀。 |
valueChanged(int) | 数值实际发生改变时触发(仅当输入内容被解析为有效整数且值变化时触发)。 | int 类型,表示当前微调框所代表的数值,不包含前缀和后缀信息。 |
4.3 例子1,饮料个数
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->spinBox->setRange(1, 100);ui->spinBox->setSuffix("瓶");ui->spinBox->setWrapping(true);ui->spinBox->setAccelerated(true);
}Widget::~Widget()
{delete ui;
}void Widget::on_spinBox_textChanged(const QString &arg1)
{qDebug() << "textChanged: " << arg1;
}
5. QDateTimeEdit
使用 QDateTimeEdit
作为时间日期的微调框。使用 QDateEdit
作为日期的微调框。使用 QTimeEdit
作为时间的微调框
4.1 常用属性
属性 | 说明 |
---|---|
dateTime | 时间日期的值,格式形如 2000/1/1 0:00:00 ,可用于获取或设置控件中显示的具体日期和时间。 |
date | 单纯日期的值,格式形如 2001/1/1 ,用于获取或设置控件中显示的日期部分。 |
time | 单纯时间的值,格式形如 0:00:00 ,用于获取或设置控件中显示的时间部分。 |
displayFormat | 时间日期格式,通过特定的格式化符号来定义显示样式,例如 yyyy/M/d H:mm 。格式化符号含义如下: - y :表示年份 - M :表示月份 - d :表示日期 - H :表示小时 - m :表示分钟 - s :表示秒 不同语言 / 库的设定规则存在差异,使用时需查阅相关文档。 |
minimumDateTime | 最小时间日期,限制用户能选择的最早日期和时间,若选择的日期时间早于此值,控件会进行相应调整。 |
maximumDateTime | 最大时间日期,限制用户能选择的最晚日期和时间,若选择的日期时间晚于此值,控件会进行相应调整。 |
timeSpec | 时间规范,决定控件显示的时间类型,有以下几种取值: - Qt::LocalTime :显示本地时间。 - Qt::UTC :显示协调世界时(UTC)。 - Qt::OffsetFromUTC :显示相对于 UTC 的偏移量(时差)。 |
4.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
dateChanged(QDate) | 当 QDateTimeEdit 中的日期部分发生改变时触发该信号。无论是用户手动输入新日期、通过日期选择器更改日期,还是通过代码修改日期,只要日期发生变化就会触发。 | QDate 类型,代表当前控件中最新的日期值。 |
timeChanged(QTime) | 当 QDateTimeEdit 中的时间部分发生改变时触发该信号。时间的改变可能是用户手动输入新时间、使用时间调整按钮修改时间,或者通过代码修改时间等情况。 | QTime 类型,代表当前控件中最新的时间值。 |
dateTimeChanged(QDateTime) | 当 QDateTimeEdit 中的日期或者时间任意一个发生改变时触发该信号。也就是说,只要日期、时间其中之一有变动,或者两者同时变动,都会触发此信号。 | QDateTime 类型,代表当前控件中最新的日期和时间组合值。 |
4.3 例子1,计算年龄
在Qt Designer
中设置基本框架
使用daysTo()
和secsTo()
计算相差的天数和秒数。但是daysTo()
在
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}int Widget::monthBetween(const QDateTime &start, const QDateTime &end)
{int startYear = start.date().year();int startMonth = start.date().month();int startDay = start.date().day();int endYear = end.date().year();int endMonth = end.date().month();int endDay = end.date().day();int monthsDiff = (endYear*12+endMonth) - (startYear*12+startMonth); // 计算月份差值if(endDay < startDay) {// 如果第二个日期的日小于第一个日期的日,说明还未到完整的一个月,需要将月数差值减 1。monthsDiff--;}return monthsDiff;
}int Widget::yearBetween(const QDateTime &start, const QDateTime &end)
{int startYear = start.date().year();int startMonth = start.date().month();int startDay = start.date().day();int endYear = end.date().year();int endMonth = end.date().month();int endDay = end.date().day();int yearsDiff = endYear - startYear;if(endMonth < startMonth ||(endMonth == startMonth && endDay < startDay)) {// 比较两个日期的月份和日期,如果第二个日期的月份和日期小于第一个日期的月份和日期,那么年份差值需要减 1。yearsDiff--;}return yearsDiff;
}int Widget::daysBetweenFake(const QDateTime &start, const QDateTime &end)
{int year = yearBetween(start, end);int month = (monthBetween(start, end)) % 12;// 把开始日期加上相差的年数和月数,得到一个临时日期 tempQDateTime tmp = start.addYears(year).addMonths(month);return start.daysTo(end) - start.daysTo(tmp);
}void Widget::on_pushButton_clicked()
{QDateTime d1 = ui->dateTimeEdit->dateTime();QDateTime d2 = ui->dateTimeEdit_2->dateTime();int secs = d1.secsTo(d2);int hour = (secs / 3600) % 24;int year = yearBetween(d1, d2);int month = (monthBetween(d1, d2)) % 12;int days = daysBetweenFake(d1, d2);
// qDebug() << year << ' ' << month << ' ' << days;QString text = (QString("两日期相差:") + QString::number(year)+QString("年 " + QString::number(month))+QString("月 " + QString::number(days))+QString("日") + QString::number(hour)+QString("小时"));ui->label->setText(text);
}
由于Qt内置的daysTo()
在计算不足一天时会算作一天,所以会有下面的情况
显然不符合常理,我们可以自己写一个myDaysTo()
,具体实现如下
// 我的daysTo(), 不足一天, 不算一天
int Widget::myDaysTo(const QDateTime &start, const QDateTime &end)
{int secs = start.secsTo(end);return (secs / 86400); // 一天是86400秒
}
这样就正确了
6. QDial
QDial
表示一个旋钮
6.1 常用属性
属性 | 说明 |
---|---|
value | 表示 QDial 持有的当前数值,可通过该属性获取或设置 QDial 所代表的值。 |
minimum | QDial 允许设置的最小值,用户无法将 QDial 的值调整到小于该值。 |
maximum | QDial 允许设置的最大值,用户无法将 QDial 的值调整到大于该值。 |
singleStep | 当按下方向键(如上下左右键)时,QDial 的数值改变的步长。例如,设置为 1,则按一次方向键,数值增加或减少 1。 |
pageStep | 当按下 PageUp 或 PageDown 键时,QDial 的数值改变的步长。通常该步长会比 singleStep 大,用于快速调整数值。 |
sliderPosition | 界面上旋钮显示的初始位置,即 QDial 初始化时旋钮所在的位置,对应的是具体的数值。 |
tracking | 决定 QDial 的外观是否会跟踪数值变化。默认值为 true ,一般情况下不需要修改。当设置为 true 时,旋钮会随着数值的改变实时移动;设置为 false 时,旋钮可能会在用户操作结束后才更新位置。 |
wrapping | 表示是否允许循环调整。若设置为 true ,当数值超过最大值时,会回到最小值继续调整;当数值小于最小值时,会回到最大值继续调整,即调整过程可以 “套圈”。若设置为 false ,则不允许这种循环调整。 |
notchesVisible | 控制是否显示刻度线。设置为 true 时,QDial 会显示刻度线;设置为 false 时,刻度线不会显示。 |
notchTarget | 用于设置刻度线之间的相对位置。该数值越大,刻度线越稀疏;数值越小,刻度线越密集。通过调整该属性,可以改变刻度线的显示密度。 |
6.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
valueChanged(int) | 当 QDial 持有的数值发生改变时触发该信号。数值的改变可能是用户通过鼠标拖动旋钮、按下方向键、PageUp /PageDown 键等操作引起的,也可能是通过代码修改 value 属性导致的。 | int 类型,代表 QDial 当前最新的数值。 |
rangeChanged(int, int) | 当 QDial 的取值范围(即 minimum 和 maximum 属性)发生变化时触发该信号。范围的改变可以通过代码调用 setMinimum() 、setMaximum() 等方法来实现。 | 两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。 |
6.3 例子1,调整窗口不透明度
在Qt Designer
中设置基本框架
设置槽函数
void Widget::on_dial_valueChanged(int value)
{double n = (double)ui->dial->value() / 100;setWindowOpacity(n);QString text = QString("不透明度:") +QString::number(value);ui->label->setText(text);
}
运行结果如下
7. QSlider
QSlider
表示一个滑动条,属性和信号与QDial
类似,这两个都继承自QAbstractSlider
7.1 常用属性
属性 | 说明 |
---|---|
value | 滑动条当前持有的数值,可通过编程方式设置或获取,反映滑动条所处位置对应的数值。 |
minimum | 滑动条允许设置的最小值,限制了滑动条可到达的最左(水平)或最上(垂直)位置对应的数值。 |
maximum | 滑动条允许设置的最大值,限制了滑动条可到达的最右(水平)或最下(垂直)位置对应的数值。 |
singleStep | 当按下方向键时,滑动条数值改变的步长。例如设置为 1,按一次方向键,数值增加或减少 1。 |
pageStep | 当按下 PageUp 或 PageDown 键时,滑动条数值改变的步长,通常用于快速调整数值,一般比 singleStep 大。 |
sliderPosition | 滑动条显示的初始位置,即滑动条在界面初始化时滑块所处的位置,对应着具体的数值。 |
tracking | 决定滑动条的外观是否会跟踪数值变化。默认值为 true ,意味着滑块会随着数值的改变实时移动;若设置为 false ,滑块可能在用户操作结束后才更新位置。一般情况下无需修改此属性。 |
orientation | 用于指定滑动条的方向,可设置为水平(Qt::Horizontal )或垂直(Qt::Vertical )。 |
invertedAppearance | 若设置为 true ,会翻转滑动条的方向。例如水平滑动条,正常是从左到右数值增大,设置后变为从右到左数值增大;垂直滑动条则是从下到上数值增大变为从上到下数值增大。 |
tickPosition | 确定刻度的位置,取值有多种: - QSlider::NoTicks :不显示刻度。 - QSlider::TicksAbove (水平)/ QSlider::TicksLeft (垂直):刻度显示在滑动条上方(水平)或左侧(垂直)。 - QSlider::TicksBelow (水平)/ QSlider::TicksRight (垂直):刻度显示在滑动条下方(水平)或右侧(垂直)。 - QSlider::TicksBothSides :刻度显示在滑动条两侧。 |
tickInterval | 控制刻度的密集程度,指定相邻两个刻度之间的数值间隔。例如设置为 10,则每隔 10 个数值显示一个刻度。 |
7.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
valueChanged(int) | 当 QSlider 的数值发生改变时触发该信号。数值改变可能是用户拖动滑块、使用键盘方向键、按下 PageUp /PageDown 键,或者通过代码修改 value 属性等操作引起的。 | int 类型,表示 QSlider 当前的最新数值。 |
rangeChanged(int, int) | 当 QSlider 的取值范围(即 minimum 和 maximum 属性)发生变化时触发该信号。范围的改变通常是通过代码调用 setMinimum() 、setMaximum() 或 setRange() 方法实现的。 | 两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。 |
7.3 例子1,调整窗口大小
在Qt Designer
中设置基本框架
设置槽函数
// 设置宽度
void Widget::on_horizontalSlider_valueChanged(int value)
{QRect pos = geometry();setGeometry(pos.x(), pos.y(), value, pos.height());
}// 设置高度
void Widget::on_verticalSlider_valueChanged(int value)
{QRect pos = geometry();setGeometry(pos.x(), pos.y(), pos.width(), value);
}
可以通过滑动条调整窗口大小
7.3 例子2,快捷键调整
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"
#include <QShortcut>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置快捷键QShortcut* s1 = new QShortcut(this);QShortcut* s2 = new QShortcut(this);s1->setKey(QKeySequence("-"));s2->setKey(QKeySequence("="));// 设置槽函数connect(s1, &QShortcut::activated, this, &Widget::reduceValue);connect(s2, &QShortcut::activated, this, &Widget::addValue);
}void Widget::addValue()
{int value = ui->horizontalSlider->value() + 5;if(value > ui->horizontalSlider->maximum()) return;ui->horizontalSlider->setValue(value);
}void Widget::reduceValue()
{int value = ui->horizontalSlider->value() - 5;if(value < ui->horizontalSlider->minimum()) return;ui->horizontalSlider->setValue(value);
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{ui->label->setText("当前value:" + QString::number(value));
}
运行结果:可以通过-
和+
调整滑动条
相关文章:

Qt常用控件 输入类控件
文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1,录入用户信息1.4 例子2,正则验证手机号1.5 例子3,验证输入的密码1.6 例子4,显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1,获取输入框的内容2.4 例…...

[LeetCode]全排列I,II
全排列I 给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入࿱…...

力扣.270. 最接近的二叉搜索树值(中序遍历思想)
文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的中序遍历) 本题的难点在于可能存在多个答案,并且要返回最小的那一个,为了解决这个问题,我门则要利用上二叉搜索树中序遍历为有序序列的特性,具体到代码中&a…...

Spring 核心技术解析【纯干货版】- VIII:Spring 数据访问模块 Spring-Tx 模块精讲
在企业级开发中,事务管理是保障数据一致性和完整性的重要手段。Spring 作为 Java 生态中广泛使用的框架,其事务管理模块(Spring-Tx)不仅提供了强大的功能,还极大地简化了开发者在不同技术栈中的事务处理工作。无论是编…...

Vue混入(Mixins)与插件开发深度解析
Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...

Linux里的容器被OOM killed的两种情况
生产上遇到过几次容器实例被OOM的现象,总结一下LInux OOM的两种触发条件。我的虚拟机是ubuntu 24.0.4版本,分配4G内存,在我的虚拟机上复现这两种case。 一 宿主机物理内存不够 当linux上所有应用程序的内存需求加起来超出了物理内存&#x…...

十一、CentOS Stream 9 安装 Docker
一、Docker 环境安装 1、软件源(仓库)信息 使用如下命令可列出当前系统配置的所有软件源(仓库)信息 # 列出所有软件源 dnf repolist 这表明系统有三个仓库 AppStream 、 BaseOS、Extras-Common 被启用 2、配置软件源镜像 使用如下命令可配置 Docker 软件包下载的镜像地址 …...

【数据结构】链表应用-链表重新排序
重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题? 我选用了迭代法来反转链表。这是一种经典且高…...

e2studio开发RA2E1(9)----定时器GPT配置输入捕获
e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载选择计时器时钟源UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()printf输出重定向到串口定时器输入捕获配…...

qt使用MQTT协议连接阿里云demo
qt使用Mqtt协议连接阿里云。 在配置好qt关于MQTT的环境之后,主要就是根据MQTT的连接参数进行连接即可。 环境配置推荐链接QT编译并部署QtMqtt相关环境跑测demo【超详细教程】_mqtt qt开发教程-CSDN博客 连接核心代码,主要就是根据阿里云的MQTT相关参数进行配置实现连…...

Python分享20个Excel自动化脚本
在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率。 本文将分享20个实用的Excel自动化脚本,以帮助新手小白更轻松地掌握这些技能。 1. Excel单…...

DNN(深度神经网络)近似 Lyapunov 函数
import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...

什么是数据库代理
数据库代理(DB Proxy)是一种位于应用程序和数据库服务器之间的中间件,充当两者之间的“中间人”。它的核心目标是优化数据库访问、提升性能、增强安全性,并简化数据库架构的复杂度,尤其在高并发、分布式或云环境中应用…...

深入浅出 DeepSeek V2 高效的MoE语言模型
今天,我们来聊聊 DeepSeek V2 高效的 MoE 语言模型,带大家一起深入理解这篇论文的精髓,同时,告诉大家如何将这些概念应用到实际中。 🌟 什么是 MoE?——Mixture of Experts(专家混合模型&#x…...

【创建模式-单例模式(Singleton Pattern)】
赐萧瑀 实现方案饿汉模式懒汉式(非线程安全)懒汉模式(线程安全)双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草,板荡识诚臣。 勇夫安识义,智者必怀仁…...

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置
从这篇文章开始我们将一起实现孢子记账的功能,这篇文章实现主币种设置。这个功能比较简单,因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研,用户需要在设置主币种的时候查看汇率信息(别问为什么有这么个需求&#…...

RabbitMQ深度探索:前置知识
消息中间件: 消息中间件基于队列模式实现异步 / 同步传输数据作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点: HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求…...

【文件上传、秒传、分片上传、断点续传、重传】
文章目录 获取文件对象文件上传(秒传、分片上传、断点续传、重传)优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…...

设计模式Python版 组合模式
文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…...

python开发:爬虫示例——GET和POST请求处理
一、Get请求 import json import requests#输入示例:urlhttps://www.baidu.com #RequestHeader:F12标头-请求标头-原始-复制到这(忽略第一句) def GetRequest(url,RequestHeader""):try:dic{}RequestHeaderList RequestHeader.s…...

【3分钟极速部署】在本地快速部署deepseek
第一步,找到网站,下载: 首先找到Ollama , 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 ,文件不是很大,下载也比较的快 第二部就是安装了 : 安装完成后提示…...

【归属地】批量号码归属地查询按城市高速的分流,基于WPF的解决方案
在现代商业活动中,企业为了提高营销效果和资源利用效率,需要针对不同地区的市场特点开展精准营销。通过批量号码归属地查询并按城市分流,可以为企业的营销决策提供有力支持。 短信营销:一家连锁餐饮企业计划开展促销活动…...

大数据sql查询速度慢有哪些原因
1.索引问题 可能缺少索引,也有可能是索引不生效 2.连接数配置:连接数过少/连接池比较小 连接数过 3.sql本身有问题,响应比较慢,比如多表 4.数据量比较大 -这种最好采用分表设计 或分批查询 5.缓存池大小 可能是缓存问题ÿ…...

安卓路由与aop 以及 Router-api
安卓路由(Android Router)和AOP(面向切面编程)是两个在Android开发中常用的概念。下面我将详细讲解这两个概念及其在Android开发中的应用。 一、安卓路由 安卓路由主要用于在应用程序中管理不同组件之间的导航和通信。它可以简化…...

游戏引擎学习第89天
回顾 由于一直没有渲染器,终于决定开始动手做一个渲染器,虽然开始时并不确定该如何进行,但一旦开始做,发现这其实是正确的决定。因此,接下来可能会花一到两周的时间来编写渲染器,甚至可能更长时间…...

备战蓝桥杯-洛谷
今天打算写一些洛谷上面的题目 P10904 [蓝桥杯 2024 省 C] 挖矿 https://www.luogu.com.cn/problem/P10904 看了大佬写的题解才写出来这道题的:题解:P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷专栏 思路: 这是一道贪心的题目,用…...

动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases
利用图神经网络进行节点分类Weights&Biases 引言 在本篇博客中,将深入探讨如何使用图神经网络(GNNs)来完成节点分类任务。以 Cora 数据集为例,该数据集是一个引用网络,节点代表文档,推断每个文档的类别。同时,使用 Weights & Biases(W&B)来跟踪实验过程和…...

如何在 FastAPI 中使用本地资源自定义 Swagger UI
要自定义 FastAPI 中的 Swagger UI,且使用本地资源来代替 CDN。只是需要稍微修改一下。 修改后的代码: 步骤: 挂载本地静态文件目录:我们将本地的 Swagger UI 资源文件(如 .js, .css, favicon.png 等)放…...

Swift 进阶:Observation 框架中可观察(@Observable)对象的高级操作(上)
概述 在 WWDC 24 中苹果推出了全新的 Observation 框架,借助于它我们可以更加细粒度的监听可观察(@Observable)对象 。同时,SwiftUI 自身也与时偕行开始全面支持 @Observable 对象的“嵌入”。 然而在这里,我们却另辟蹊径来介绍 @Observable 对象另外一些“鲜为人知”的故…...

aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API
aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容: 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API,之后再接收到了http request之后,redirect到lambda进行执行。…...

UE学习日志#23 C++笔记#9 编码风格
注:此文章为学习笔记,只记录个人不熟悉或备忘的内容 1 为代码编写文档 1.1 使用注释的原因 1.说明用途的注释 应该注释的信息:输入,输出含义,参数的类型含义,错误条件和处理,预期用途&#x…...

vue2-vue自定义指令
文章目录 vue2-vue自定义指令1. 什么是指令2. 自定义指令2.1 全局注册2.2 局部注册 3. 自定义指令的钩子函数4. 钩子函数的参数4. 用例 vue2-vue自定义指令 1. 什么是指令 在vue中提供了一套为数据驱动视图更为方便的操作,这些操作被称为指令系统我们平时使用的v-…...

[250202] DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择 | Jekyll 4.4.0 发布
目录 DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择DocumentDB 的使命DocumentDB 的架构 Jekyll 4.4.0 版本发布🆕 新特性与改进 DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择 微软近日宣布开源 DocumentDBÿ…...

matplotlib绘制三维曲面图时遇到的问题及解决方法
在科学计算和数据可视化中,三维曲面图是非常有用的工具,可以直观地展示数据的三维分布和关系。Matplotlib是Python中广泛使用的数据可视化库之一,提供了强大的三维绘图功能。然而,在实际使用过程中,用户可能会遇到各种…...

【数据结构】(4) 线性表 List
一、什么是线性表 线性表就是 n 个相同类型元素的有限序列,每一个元素只有一个前驱和后继(除了第一个和最后一个元素)。 数据结构中,常见的线性表有:顺序表、链表、栈、队列。 二、什么是 List List 是 Java 中的线性…...

简单React项目从0到1
文章目录 项目搭建基于CRA创建项目调整项目目录结构 使用scss预处理器组件库antd使用配置基础路由配置别名路径路径编译配置VsCode提示配置 基本结构搭建表单校验实现获取登录表单数据封装request工具模块使用Redux管理token安装Redux相关工具包配置Redux 实现登录逻辑token持久…...

IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案
IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…...

MFC 学习笔记目录
序章 MFC学习笔记专栏开篇语-CSDN博客 下载与安装 VS2010 下载与安装 VS2019...

一文讲解Java中的ArrayList和LinkedList
ArrayList和LinkedList有什么区别? ArrayList 是基于数组实现的,LinkedList 是基于链表实现的。 二者用途有什么不同? 多数情况下,ArrayList更利于查找,LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…...

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途
1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多,删除代价也小。这种说法主要基于以下几个方面: (1)资源共享 内存空间:每个进程都有自己独立的内存空间,包括代码段…...

HTML 复习
文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…...

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能
一、引言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志: 网络爬虫学习:应用selenium从搜*狐搜…...

【数据结构】单向链表(真正的零基础)
放弃眼高手低,你真正投入学习,会因为找到一个新方法产生成就感,学习不仅是片面的记单词、学高数......只要是提升自己的过程,探索到了未知,就是学习。 目录 一.链表的理解 二.链表的分类(重点理解…...

8. k8s二进制集群之Kubectl部署
创建kubectl证书请求文件生成admin证书文件复制admin证书到指定目录生成kubeconfig配置文件接下来完成kubectl配置文件的角色绑定【扩展】kubectl命令补全操作继续上一篇文章《k8s二进制集群之Kube ApiServer部署》下面介绍一下k8s中的命令行管理工具kubectl。 通过kubectl可以…...

115,【7】 攻防世界 web fileinclude
进入靶场 试着访问了几个文件,都没得到信息,f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值,这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)
接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...

【MySQL】MySQL经典面试题深度解析
文章目录 一、MySQL与C的深度结合1.1 为什么C项目需要MySQL?1.2 典型应用场景 二、基础概念面试题精讲2.1 存储引擎对比2.2 索引原理 三、C专项面试题解析3.1 连接池实现3.2 预处理语句3.3 批量操作优化 四、高级应用面试题剖析4.1 事务隔离级别4.2 锁机制详解4.3 查…...

小程序-基础加强
前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前,我们的项目根目录得有package.json 没有的话,我们就初始化一个 但是我们没有npm这个…...

vscode+CMake+Debug实现 及权限不足等诸多问题汇总
环境说明 有空再补充 直接贴两个json tasks.json {"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"…...