当前位置: 首页 > news >正文

【Qt】常用控件

文章目录

  • QWidget
    • enabled
    • geometry
    • window frame
    • windowTitle
    • windowIcon
    • qrc资源管理
    • windowOpacity
    • cursor
    • font
    • toolTip
    • focusPolicy
    • styleSheet
  • 按钮类
    • PushButton
    • RadioButton
    • CheckBox
    • Signals
  • 显示类
    • Label
    • LCDNumber
    • ProgressBar
    • Calendar
  • 输入类
    • LineEdit
    • TextEdit
    • ComboBox
    • SpinBox
    • DateTimeEdit
    • Dial
    • Slider
    • 快捷键
  • 多元素控件
    • ListWidget
    • TableWidget
    • TreeWidget
  • 容器类控件
    • GroupBox
    • TabWidget
  • 布局管理器
    • 垂直布局
    • 水平布局
    • 网格布局
    • 表单布局


QWidget

所有控件的父类

enabled

APIIntro
isEnabled()返回控件是否可用,可用为true,不可用为false
setEnable(bool)设置控件的可用状态,可用为true,不可用为false

geometry

位置与尺寸,位置指的是控件在父控件中的坐标。

  • x 横坐标
  • y 纵坐标
  • width 宽度
  • height 高度

image-20240627094751437

APIIntro
geometry()获取到控件的位置和尺寸,返回结果是⼀个QRect
setGeometry(QRect)使用QRect对象,设置控件的位置和尺寸
setGeometry(int x,int y, int width,int height)分四个属性设置控件的位置和尺寸

QRect: 保存位置和尺寸的对象,包含了x, y, width, height,其中x, y是控件左上⻆的坐标。其接口setX(), setY()只是修改控件左上角点的坐标,width和height会随之改变。

示例:点击操控某个控件的尺寸不变,上下左右移动

void Widget::on_pushButton_up_clicked()
{QRect rect = ui->target->geometry();ui->target->setGeometry(rect.x(), rect.y()-20, rect.width(), rect.height());
}void Widget::on_pushButton_down_clicked()
{QRect rect = ui->target->geometry();ui->target->setGeometry(rect.x(), rect.y()+20, rect.width(), rect.height());
}void Widget::on_pushButton_left_clicked()
{QRect rect = ui->target->geometry();ui->target->setGeometry(rect.x()-20, rect.y(), rect.width(), rect.height());
}void Widget::on_pushButton_right_clicked()
{QRect rect = ui->target->geometry();ui->target->setGeometry(rect.x()+20, rect.y(), rect.width(), rect.height());
}

window frame

image-20240626115139429

  • 如果widget作为⼀个窗⼝(带有标题栏,最⼩化,最⼤化,关闭按钮),那么在计算尺⼨和坐标的
    时候就有两种算法.包含windowframe和不包含windowframe.
  • 其中x(),y(),frameGeometry(),pos(),move()都是按照包含windowframe的⽅式来计算
    的.
  • 其中geometry(),width(),height(),rect(),size()则是按照不包含windowframe的⽅式来计
    算的.
  • 当然,如果⼀个不是作为窗⼝的widget,上述两类⽅式得到的结果是⼀致的.

windowTitle

控件的窗口标题

APIIntro
windowTitle()获取控件的窗口标题
setWindowTitle(const QString& title)设置控件的窗口标题

上述设置操作针对不同的widget可能会有不同的⾏为。如果是顶层widget(独⽴窗⼝),这个操作才会有效。

windowIcon

控件的窗口图标

APIIntro
windowIcon()获取控件的窗口图标,返回QIcon对象
setWindowIcon(const QIcon& icon)设置控件的窗口图标

同windowTitle,上述操作仅针对顶层widget有效

对于自定义图标,可用先创建一个QPixmap对象,导入自定义图片(qrc),再用该对象创建QIcon

qrc资源管理

  1. 右键项⽬,创建⼀个QtResourceFile(qrc⽂件),⽂件名随意起(不要带中⽂),此处叫做resource.qrc。在qrc编辑器中,添加前缀,表示图片在Qt项目中的相对路径,供代码中使用。添加资源文件,添加的⽂件必须是在qrc⽂件的同级⽬录,或者同级目录的子目录。

image-20240626113223036

  1. 将图片导入qrc后,在build构建目录中debug文件夹会生成一个qrc_resource.cpp文件,图片转化成cpp代码(一个保存二进制数据的数组)。最后项目编译时,会将这些代码编译到exe文件中,后续⽆论exe被复制到哪个⽬录下,都确保能够访问到该图片资源。

image-20240626113056667

image-20240626113109744

  1. 在Qt代码中使用来自qrc的资源
QPixmap pixmap(":/add.png");
  • : 表示从qrc中获取资源
  • / 是在qrc中已添加的(虚拟 )资源文件目录前缀
  • add.png 是资源文件名

qrc资源管理方案的优缺点

  • 优点:确保了图⽚,字体,声⾳等资源能够真正做到"目录⽆关",⽆论如何都不会出现资源丢失的情况。

  • 缺点:不适合管理体积⼤的资源。如果资源比较⼤(⽐如是⼏个MB的⽂件),或者资源特别多,⽣成的最终的exe体积就会⽐较⼤,程序运⾏消耗的内存也会增⼤,程序编译的时间也会显著增加。

windowOpacity

控件的透明度。但事实上是不透明的程度,用浮点数表示,数值越大,控件越不透明。

APIIntro
windowOpacity()获取到控件的不透明数值,返回float,取值为[0.0, 1.0]。其中0.0表示全透明,1.0表示完全不透明
setWindowOpacity(level)设置控件的不透明度,level最大值为1,大于1自动转换为1。

cursor

控件的悬停光标样式

APIIntro
cursor()获取当前控件的光标样式,返回QCursor对象
setCursor(const QCursor& cursor)设置控件的光标样式,仅在⿏标停留在该控件上时⽣效

QCursor是表示光标样式的对象,可以使用Qt内置的,也可以自定义。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使用内置光标this->setCursor(Qt::WaitCursor);//创建一个pixmap对象,加载自定义光标图像(来自qrc)QPixmap pixmap(":/add.png");//可以对pixmap进行缩放,scaled返回的是缩放后的图像副本pixmap = pixmap.scaled(30, 30);//通过pixmap创建一个cursor对象,可以设置热点(光标点击生效的点)坐标QCursor cursor(pixmap, 15, 15);//设置光标ui->pushButton_add_opacity->setCursor(cursor);
}

font

字体属性

APIIntro
font()获取控件的字体信息,返回QFont对象
setFont()设置控件的字体信息

QFont用于表示字体的各种属性信息。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{QLabel *label = new QLabel(this);label->setText("Hello World!");QFont font;//设置字体家族font.setFamily("Consola");//设置字体大小font.setPointSize(20);//设置字体加粗font.setBold(true);//设置字体倾斜font.setItalic(true);//设置下划线font.setUnderline(true);//设置删除线font.setStrikeOut(true);//将字体信息设置到文本上label->setFont(font);
}

toolTip

鼠标悬停在控件上时,提示用户一些信息(一般是该控件的功能、属性等)

APIIntro
setToolTip(const QString& )设置toolTip,鼠标悬停时的提示说明
setToolTipDuration(int msec)提示的时间,单位是ms,时间一到toolTip自动消失
this->setToolTip("Hello");
this->setToolTipDuration(2000);

focusPolicy

控件获取到焦点的策略。控件获取到焦点意味着接下来的操作都对此控件进行(常用于多个输入栏的切换)。

APIIntro
focusPolicy()获取控件获取焦点的策略,返回Qt::FocusPolicy
setFocusPolicy()设置控件获取焦点的策略

Qt::FocusPolicy是Qt内置的枚举类型,取值如下:

namespace Qt{//...enum FocusPolicy {NoFocus = 0, 								//不会获取焦点TabFocus = 0x1,								//控件可通过Tab键获取到焦点ClickFocus = 0x2,							//控件可通过鼠标点击获取到焦点StrongFocus = TabFocus | ClickFocus | 0x8,	//Tab和数据点击接受焦点(默认值)WheelFocus = StrongFocus | 0x4				//类似于Qt::StrongFocus,同时控件也通过⿏标滚轮获取到焦点};
}
//设置focusPolicy的方法
widget->setFocusPolicy(Qt::NoFocus);

styleSheet

层叠样式表 QSS

设置样式的格式——键值对

按钮类

image-20240627110507279

按钮都继承自QAbstractButton类,按钮的很多关键的属性都来自这个基类。

属性 (from QAbstractButton)说明
text按钮中的文本
icon按钮中的图标
iconSize图标尺寸
shortCut按钮的快捷键
autoRepeat (true or false)按钮是否会重复触发,即鼠标左键按住不放时,是否“连发”
autoRepeatDelay重复触发的延时时间,即按住按钮多久后,开始“连发”
autoRepeatInterval重复触发的周期
checkable是否可被选中
checked是否已被选中,checkable是checked的前提条件

PushButton

设置按钮的快捷键

void setShortcut(const QKeySequence &key);

QKeySequence:用于保存快捷键序列的对象,因为快捷键可以是单个,也可以是多个键的组合。对于QKeySequence对象的构造,可用表示按键的字符串,如QKeySequence("w");也可用Qt内置的表示按键的宏,如下:

ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_Up));//单个快捷键
ui->pushButton_up->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Up));//组合快捷键

按钮设置快捷键后,按下一次快捷键,发出的信号是clicked(按下了就触发,而不是按下后释放再触发),相当于鼠标点击一次按钮(press + released)。所以当你按住快捷键时,是会重复触发clicked的(不停在按下)。

样例:上下左右方向键,控制飞机的移动

79086ad1-23ea-45b8-a0ae-e8d6cc48f2d7
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon(":/image/plane.png");ui->plane->setIcon(icon);//设置飞机图标ui->plane->setIconSize(QSize(50, 50));//设置图标尺寸//设置方向键图标ui->pushButton_up->setIcon(QIcon(":/image/up.png"));ui->pushButton_down->setIcon(QIcon(":/image/down.png"));ui->pushButton_left->setIcon(QIcon(":/image/left.png"));ui->pushButton_right->setIcon(QIcon(":/image/right.png"));//设置方向键快捷键ui->pushButton_up->setShortcut(QKeySequence(Qt::Key_Up));//组合快捷键ui->pushButton_down->setShortcut(QKeySequence(Qt::Key_Down));ui->pushButton_left->setShortcut(QKeySequence(Qt::Key_Left));ui->pushButton_right->setShortcut(QKeySequence(Qt::Key_Right));//开启重复触发ui->pushButton_up->setAutoRepeat(true);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_up_clicked()
{QRect rect = ui->plane->geometry();ui->plane->setGeometry(rect.x(), rect.y() - 5, rect.width(), rect.height());
}
void Widget::on_pushButton_down_clicked()
{QRect rect = ui->plane->geometry();ui->plane->setGeometry(rect.x(), rect.y() + 5, rect.width(), rect.height());
}
void Widget::on_pushButton_left_clicked()
{QRect rect = ui->plane->geometry();ui->plane->setGeometry(rect.x() - 5, rect.y(), rect.width(), rect.height());
}
void Widget::on_pushButton_right_clicked()
{QRect rect = ui->plane->geometry();ui->plane->setGeometry(rect.x() + 5, rect.y(), rect.width(), rect.height());
}

RadioButton

QRadioButton单选按钮,按钮之间具有“排他性”,即一组单选按钮中只能选中其中一个。

QAbstractButton中与QRadioButton较为相关的属性

属性说明
checkable是否可被选中
checked是否已被选中,checkable是checked的前提条件
autoExclusive是否“排他”,对于QRadioButton默认是“排他”的

通常情况下需要为RadioButton分组,以满足不同分类的选择,否则整个页面的单选按钮都有“排他性”,因为它们默认在一个组内。如下是一个简单的点餐菜单,我们想要实现的是每个类型中的选择唯一性,因此必须进行分组。

image-20240627143404353

Qt中提供了QButtonGroup类以实现按钮的分组

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建按钮组QButtonGroup* groupStaple = new QButtonGroup(this);QButtonGroup* groupDrink = new QButtonGroup(this);QButtonGroup* groupSnack = new QButtonGroup(this);//为按钮组添加按钮groupStaple->addButton(ui->radioButton);groupStaple->addButton(ui->radioButton_2);groupStaple->addButton(ui->radioButton_3);groupDrink->addButton(ui->radioButton_5);groupDrink->addButton(ui->radioButton_6);groupDrink->addButton(ui->radioButton_7);groupSnack->addButton(ui->radioButton_8);groupSnack->addButton(ui->radioButton_9);
}

“排他性”意味着用户无法多选或取消选中,若想要取消选中,要先暂时地取消“排他性”。如下示例,点餐(这里只点了主食)提交后,实现重置(清除)所有选中。

void Widget::on_pushButton_clicked()
{QButtonGroup* groupStaple = findChild<QButtonGroup*>("groupStaple");//获取按钮组if (groupStaple){QList<QAbstractButton*> buttons = groupStaple->buttons();groupStaple->setExclusive(false);  // 取消排他性 (按钮组的排他性,决定该组中的按钮之间是否互斥)foreach(QAbstractButton *button, buttons)//遍历groupStaple中所有单选按钮{button->setChecked(false);// 取消groupStaple中所有单选按钮的选中状态}groupStaple->setExclusive(true);  // 恢复排他性}else{qDebug() << "groupStaple not found";}
}

CheckBox

QCheckBox 复选按钮,支持多选,和 QCheckBox 最相关的属性也是 checkablechecked , 都是继承⾃QAbstractButton

image-20240627151051965

Signals

image-20240627150547907

clicked有带参数和不带参数的两种类型:

  • clicked():点击“按钮”(按下+释放),不提供按钮状态信息。

  • clicked(bool checked):适用于可切换按钮,提供按钮的选中状态信息。

  • pressed():“按下”按钮

  • released(): “释放”按钮

  • toggled(bool checked): 按钮状态切换时

示例:

void Widget::on_checkBox_clicked(bool checked)
{//复选按钮被选中时 checked == true//复选按钮取消选中时 checked == falseqDebug() << "clicked(bool)" << checked;
}
void Widget::on_radioButton_4_toggled(bool checked)
{//切换状态时触发: //被选中 checked == true//未选中 checked == falseqDebug() << "toggled(bool)" << checked;
}

显示类

Label

Qlabel可以显示文字和图片

文本格式

QLabel属性说明
textQlabel中的文本
textFormat文本的格式:纯文本、富文本、markdown,通过Qt自带的宏设置
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->label->setText("<b>这是一段文本</b>");ui->label->setTextFormat(Qt::PlainText);//纯文本ui->label_2->setText("<b>这是一段文本</b>");ui->label_2->setTextFormat(Qt::RichText);//富文本ui->label_3->setText("# 这是一段文本");ui->label_3->setTextFormat(Qt::MarkdownText);//markdownui->label_4->setText("<i>这是一段文本</i>");ui->label_4->setTextFormat(Qt::AutoText);//根据文本内容自动决定格式
}

image-20240627183727102

设置图片

属性说明
pixmaplabel中的图片 (QPixmap)
scaledContents设为true表示自动拉伸内容(仅对图片有效),填充Qlabel;设为false则不会自动拉伸
ui->label_image->setPixmap(QPixmap(":/cat.png"));//设置QLabel的图片
ui->label_image->setScaledContents(true);//自动伸缩填满QLabel

文本控制(对齐、自动换行、缩进、边距)

属性说明
alignment对齐方式,由Qt内置宏提供,可以选中一种对齐方式,也可以多种组合
wordWrap设为 true 内部的文本会自动换行,防止文本长度过长,设为 false不会自动换行
indent设置文本缩进,水平和垂直方向都生效
margin内部⽂本和Qlabel边框之间的边距,上下左右四个方向同时生效

伙伴

属性说明
buddy给 QLabel 关联⼀个 “伙伴” , 这样触发QLabel时就能激活对应的伙伴,这里的“触发”一般是为QLabel设置一个快捷键
ui->label_buddy->setText("快捷键: &A");//QLabel文本中,'&'后的字符被定义为该QLabel的快捷键
ui->label_buddy->setBuddy(ui->radioButton);//将QLabel设置为单选按钮的伙伴

用户通过alt + 快捷键来触发QLabel,从而激活对应的伙伴。

image-20240627191432190

LCDNumber

QLCDNumber显示数字,效果类似于“老式计算器”。

image-20240630100959566

QLCDNumber的主要属性

属性说明
intValue显示数字的数值 (int整型)
value显示数字的数值 (double浮点型),intValue和value存在联系,如value设为3.14,intValue就是3。
digitCount显示几位数字(从右往左,少的显示空格)
mode显示数字的进制:十进制、十六进制、二进制、八进制。只有十进制能显示小数点后的数字
segmentStyle设置显示的风格

注:与以往不同,对于intValue和value的设置,api是display()(重载了int, double和QString三种类型参数的设置),而不是setintValue()setValue()

例:用QLCDNumber设计一个倒计时

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置初始值ui->lcdNumber->display(5);//创建一个定时器QTimer* timer = new QTimer(this);//将定时器的 timeout信号 绑定一个槽函数connect(timer, &QTimer::timeout, this, [this, timer](){//获取lcdNumber上的数字int value = this->ui->lcdNumber->intValue();if(value <= 0){//倒计时结束timer->stop();return;}this->ui->lcdNumber->display(value - 1);});//启动计时器,设置触发timeout的周期(单位是毫秒)timer->start(1000);
}

QTimer是Qt中提供的一个定时器。在GUI编程中,很多场景会用到计时的功能(如倒计时、进度条等),一般来说可以创建一个异步线程,结合sleep()接口,以实现计时功能。

但在Qt中又规定,Qt的界面由主线程维护,不允许其它线程对界面进行操作,以保证线程安全。因此,为了满足计时功能的需求,Qt提供了QTimer,其工作机制是:每个一段时间间隔interval,就发出一次timeout信号,它只负责计时,不负责实现“时间到”之后的具体逻辑。用户可以自定义interval和绑定槽函数,以实现不同的计时需求。而信号槽机制中,默认都是由主界面接收并处理信号,这样一来便很好地满足了GUI中的计时需求。

QTimer的主要接口

API说明
start(int msec)启动计时器,并设置触发timeout的周期(单位是毫秒)
stop()停止计时器

ProgressBar

QProgressBar进度条

image-20240630105856760

QProgressBar的主要属性

属性说明
minimum进度条最小值
maximum进度条最大值
value进度条当前值
format展示数字的格式:%p百分比、%v数值、%m剩余时间(毫秒)、%t总时间(毫秒)

例:进度条走完,关闭窗口

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);int min = ui->progressBar->minimum();int max = ui->progressBar->maximum();ui->progressBar->setValue(min);QTimer* timer = new QTimer(this);connect(timer, &QTimer::timeout, this, [=](){int value = ui->progressBar->value();if(value >= max){timer->stop();this->close();return;}ui->progressBar->setValue(value + 1);});timer->start(100);
}

QProgressBarQLCDNumber相同,往往需要和定时器QTimer搭配使用。

使用QSS改变进度条的颜色:

image-20240630110823055

Calendar

QCalendarWidget是Qt中的日历控件

image-20240630111003585

QCalendarWidget的主要属性

属性说明
selectDate当前选中的日期(QDate
dateEditEnabled日期是否允许被编辑 (bool)
minimumDate最大日期(QDate
maximumDate最小日期(QDate

QCalendarWidget的主要信号

信号说明
selectionChanged(const QDate&)当选中的⽇期发⽣改变时发出
activated(constQDate&)当双击⼀个有效的⽇期或者按下回⻋键时发出,形参是⼀个QDate类型,保存 了选中的⽇期
currentPageChanged(int, int)当年份⽉份改变时发出,形参表⽰改变后的新年份和⽉份

输入类

LineEdit

QLineEdit是单行输入框,可以输入一行文本,不能换行。

QLineEdit的主要属性

属性说明
text输入框中的文本
inputMask输入内容的格式约束 (QString)
maxLength最大文本长度
echoMode显示方式:1.QLineEdit::Normal2.QLineEdit::Password 3.QLineEdit::NoEcho
readOnly是否为只读 (bool)
placeHolderText当输入框为空时的显示信息,一般作为提示
clearButtonEnabled当输入框不为空时,是否会显示清除按钮 (bool)

QLineEdit的主要信号

信号说明
void textChanged(const QString& text)当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。 代码对⽂本的修改能够触发这个信号
void textEdited(const QString& text)当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。 代码对⽂本的修改不能触发这个信号
  • 输入内容的格式约束

    inputMask可以实现输入内容的格式约束

    ui->lineEdit_phone->setInputMask("000-0000-0000");//其中'0'代表数字
    

    但在实际开发中,通常采用“正则表达式”来实现格式约束,Qt中提供验证器QValidator,其派生类QRegExpValidator为正则验证器,我们可以为QLineEdit设置一个正则验证器,以验证输入栏中的内容是否符合预期格式。

    例:学生输入学号,只有当输入学号合法时,才允许提交

    #include "widget.h"
    #include "ui_widget.h"
    #include <QRegExpValidator>
    #include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
    {ui->setupUi(this);ui->pushButton_submit->setEnabled(false);//当输入学号合法时,才允许提交ui->lineEdit_id->setPlaceholderText("请输入学号: 入学年份-学院号-个人号");ui->lineEdit_id->setClearButtonEnabled(true);//为lineEdit_id注册一个正则验证器,并为验证其设置正则表达式ui->lineEdit_id->setValidator(new QRegExpValidator(QRegExp("^20\\d{2}\\d{3}\\d{3}$")));//该正则表达式的含义//入学年份4位,且必须以 20 开头//学院号3位//个人号3位
    }
    void Widget::on_lineEdit_id_textEdited(const QString &arg1)
    {QString id = arg1;int pos = 0;//验证新输入学号的是否符合正则表达式的格式if(ui->lineEdit_id->validator()->validate(id, pos) == QValidator::Acceptable){//符合ui->pushButton_submit->setEnabled(true);}else{//不符合ui->pushButton_submit->setEnabled(false);}
    }
    void Widget::on_pushButton_submit_clicked()
    {qDebug() << ui->lineEdit_id->text();
    }
    

TextEdit

QTextEdit是多行输入框,可以输入多行文本。

主要属性

属性说明
markdown输入框中的内容支持markdown格式
html输入框中的内容支持html格式
placeHolderText当输入框为空时的显示信息,一般作为提示
undoRedoEnable是否触发 undo (ctrl + z) / redo (ctrl + y) 功能
verticalScrollBarPolicy垂直方向滚动条的出现策略,默认根据内容⾃动决定是否需要滚动条
horizontalScrollBarPolicy水平方向滚动条的出现策略,默认根据内容⾃动决定是否需要滚动条

主要方法

接口说明
QString toHtml()html格式获取输入框中的文本
QString toMarkdown()markdown格式获取输入框中的文本
void setHtml(const QString &text)设置输入框中的内容为一段html格式的文本,并且此后输入都是这种格式
void setMarkdown(const QString &text)设置输入框中的内容为一段markdown格式的文本,并且此后输入都是这种格式
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->label->setTextFormat(Qt::MarkdownText);ui->pushButton->setText("转化为html");
}Widget::~Widget()
{delete ui;
}void Widget::on_textEdit_textChanged()
{ui->label->setText(ui->textEdit->toMarkdown());
}void Widget::on_pushButton_clicked()
{ui->textEdit->setHtml("<b>你好</b>");
}
image-20240701110249291

输入markdown格式文本,在label中渲染成markdown

image-20240701110315117

转化为html后,再输入的内容都是预设的<b></b>格式。

主要信号

信号触发时机
textChanged输入框内容发生改变时
selectionChanged()选中的文本发生改变时
cursorPositionChanged()光标的位置发生改变时
undoAvailable(bool)undo功能可用状态切换时(内容不为空,undo就可用)
redoAvailable(bool)redo功能可用状态切换时(undo之后,redo就可用)
copyAvaiable(bool)⽂本被选中/取消选中时触发

QTextCursor表示文本光标,可获取选中的文本、光标的位置。通常和selectionChangedcursorPositionChanged信号搭配使用。

void Widget::on_textEdit_selectionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();//获取textEdit的光标ui->label->setText(cursor.selectedText());//获取被选中的文本
}void Widget::on_textEdit_cursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();//获取textEdit的光标qDebug() << "cursorPositionChanged()" << cursor.position();//获取光标位置
}
image-20240701112931800

ComboBox

QComboBox下拉列表,多个选项供用户选择

主要属性

属性说明
currentText当前选中条目的文本
currentIndex当前选中条目的下标(从0开始,无选中条目则为-1)
editable是否可编辑
iconSize下拉框图标(小三角)的大小
maxCount条目最大个数

主要方法

接口说明
addItem(const QString& )添加条目
currentText()获取当前选中条目的文本
currentIndex()获取当前选中条目的下标
setEditable(bool)设置是否可编辑

editable设为true, 用户确认编辑的条目后, 若该条目不存在, 则添加这个条目

ui->comboBox->addItem("战士");
ui->comboBox->addItem("法师");
ui->comboBox->addItem("坦克");
ui->comboBox->setEditable(true);//设下拉列表为可编辑
image-20240701120823891

主要信号

信号说明
currentIndexChanged(int)当前条目下标改变时触发, 传入参数为改变后的条目下标
currentIndexChanged(QString)当前条目下标改变时触发, 传入参数为改变后的条目文本
currentTextChanged(QString)当前条目文本改变时触发, 传入参数为改变后的条目文本
activated(int) / activated(QString)用户选中一个条目时触发 (不管该条目是否已选中)

SpinBox

QSpinBox微调框,对数字进行微调。QSpinBox针对整型,QDoubleSpinBox针对浮点数,用法基本相同。

主要属性

属性说明
value当前值
singleStep单次调整的步长
displayInterger数字的进制。例如displayInteger设为10,则是按照十进制表示,设为2则为二进制表示
minimum最小值
maximum最大值
suffix后缀
prefix前缀

setRange(int min, int max)可以调整最大值和最小值,即修改微调框可变的数值范围。

主要信号

信号触发时机
valueChanged(int)微调框的⽂本发⽣改变时触发,参数int表示当前的数值.
textChanged(QString)微调框的⽂本发⽣改变时触发,参数QString带有前缀和后缀

DateTimeEdit

QDateTimeEdit编辑日期与时间

主要属性

属性说明
dateTime日期时间的值 (QDateTime)
date日期 (QDate)
time时间 (QTime)
displayFormat时间日期格式。形如 yyyy/M/d H:mm
minimumDateTime最小日期时间
maximumDateTime最大日期时间
timeSpecQt::LocalTime:本地时间;Qt::UTC:显⽰协调世界时(UTC);Qt::OffsetFromUTC :显⽰相对于UTC的偏移量(时差)
setDateTimeRange(const QDateTime &min, const QDateTime &max)//设置日期时间的范围
  • 关于QDateTime

    Qt中用于表示日期时间的类是QDateTime,以下是QDateTime一些常用的接口,方便我们对日期时间进行操作

    接口说明
    daysTo(const QDateTime &other)thisother之间的天数。但有时会不符合预期,比如 2024/1/1 23:55 - 2024/1/2 0:05也会被算成一天。
    secsTo(const QDateTime &other)thisother之间的秒数
    QString toString(const QString &format)将日期时间转化成字符串,format是日期时间的字符串格式。

样例:日期计算器,计算两个日期之间的差值(几天几时)

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_calc_clicked()
{//1.获取两个前后两个日期时间QDateTime former = ui->dateTimeEdit_former->dateTime();QDateTime later = ui->dateTimeEdit_later->dateTime();//2.计算两个日期时间差值int secs = former.secsTo(later);int days = secs / (3600 * 24);//总秒数 / 一天的秒数int hours = (secs / 3600) % 24;// 总秒数/一小时的秒数 = 总小时数ui->label_ret->setText(QString::number(days) + "天" + QString::number(hours) + "时");
}void Widget::on_dateTimeEdit_later_dateTimeChanged(const QDateTime &later)
{//确保第一个时间在第二个时间之前QDateTime former = ui->dateTimeEdit_former->dateTime();if(later < former){ui->dateTimeEdit_former->setDateTime(later);ui->dateTimeEdit_later->setDateTime(former);}
}

image-20240701164425374

Dial

QDial表示一个旋钮,通过旋转改变数值

Slider

QSlider表示一个滑动条,通过滑动改变数值

快捷键

Qt中基于信号槽机制,提供了一种通用的设置快捷键的方法。QShortcut表示快捷键,用户可使用该类自定义快捷键。当相应的快捷键被激活时,触发QShortcut的信号activated,用户可自定义槽函数,完成快捷键被激活后的特定工作。

样例:设置快捷键-=控制旋钮,旋钮的功能是控制窗口的透明度

#include "widget.h"
#include "ui_widget.h"
#include <QShortcut>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//1.设置旋钮的属性ui->dial->setRange(0, 100);//旋钮数值范围(透明度范围)ui->dial->setValue(100);//旋钮初始值ui->dial->setWrapping(true);//允许循环转动ui->dial->setNotchesVisible(true);//显示刻度线//2.设置快捷键QShortcut* shortcutSub = new QShortcut(this);shortcutSub->setKey(QKeySequence("-"));QShortcut* shortcutAdd = new QShortcut(this);shortcutAdd->setKey(QKeySequence("="));//3.绑定快捷键的“激活”信号和槽函数connect(shortcutSub, &QShortcut::activated, this, [=](){if(this->ui->dial->value() > 0){this->ui->dial->setValue(this->ui->dial->value() - 5);}});connect(shortcutAdd, &QShortcut::activated, this, [=](){if(this->ui->dial->value() < 100){this->ui->dial->setValue(this->ui->dial->value() + 5);}});
}Widget::~Widget()
{delete ui;
}void Widget::on_dial_valueChanged(int value)
{this->setWindowOpacity(value / 100.0);
}

多元素控件

ListWidget

QListWidget是一个纵向列表

主要属性

属性说明
currentRow当前被选中的是第几行(行的下标从0开始),若无选中,返回-1
count一共有多少行
sortingEnabled列表是否允许排序(若是,默认升序,可通过sortItems修改排序方式)

主要方法

接口说明
void addItem(const QString &label)
void addItem(QListWidgetItem *item)
添加列表元素
void insertItem(int row, QListWidgetItem *item)
void insertItem(int row, const QString &label)
在指定位置插入元素
QListWidgetItem *currentItem()
int currentRow()
返回当前选中的元素(指针或下标)
QListWidgetItem * takeItem(int row)删除并返回指定行的元素
QListWidgetItem * item(int row)返回指定行的元素
void setCurrentItem(QListWidgetItem *item)
void setCurrentRow(int row)
设置选中的元素(使用指针或下标)

注意,多元素控件QListWidget中,对于某一个元素,可以用行表示,也可以用QListWidgetItem指针表示。

QListWidgetItem是表示QListWidget中一个元素的类,本质是设置元素中的文本和图标,以及字体样式等。

样例:根据输入内容,新增列表的元素;删除指定列表中元素

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setClearButtonEnabled(true);ui->listWidget->setSortingEnabled(true);ui->listWidget->addItem(new QListWidgetItem("初始"));//使用QListWidgetItem类添加元素
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_add_clicked()
{const QString& text = ui->lineEdit->text();if(!text.isEmpty()){ui->listWidget->addItem(text);}
}void Widget::on_pushButton_del_clicked()
{qDebug() << ui->listWidget->currentItem()->text();//获取选中元素的文本int row = ui->listWidget->currentRow();if(row >= 0){ui->listWidget->takeItem(row);}
}
image-20240711171901668

主要信号

信号触发时机
currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)选中元素发生变化时(current变化后元素,previous变化前元素)
currentRowChanged(int currentRow)选中元素发生变化时(currentRow当前行)
itemClicked(QListWidgetItem*item)点击某个元素时触发
void Widget::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{if(current) qDebug() << "当前元素:" << current->text();if(previous) //若没有变化前没有选中元素,previous为nullptrqDebug() << "最近元素:" << previous->text();
}

TableWidget

QTableWidget是一个表格控件

主要属性

属性说明
columnCount列数
rowCount行数

主要方法

方法说明
QTableWidgetItem * item(int row, int column)根据行和列获取表格中某一元素
void setItem(int row, int column, QTableWidgetItem *item)根据行和列设置表格中某一元素
QTableWidgetItem * currentItem()返回被选中的元素
int currentRow() const返回被选中元素的行
int currentColumn() const返回被选中元素的列
setColumnCount(int)设置表格列数
setRowCount(int)设置表格行数
void setHorizontalHeaderItem(int column, QTableWidgetItem *item)设置列表头
void setVerticalHeaderItem(int column, QTableWidgetItem *item)设置行表头
void insertRow(int row)在指定位置插入新行
void insertColumn(int row)在指定位置插入新列
void removeRow(int row)删除指定行
void removeColumn(int column)删除指定列

QListWidget相同,在QTableWidget中,对于某一个元素,可以用行和列表示,也可以用QTableWidgetItem 指针表示。而QTableWidgetItem 除了设置文本图标样式,还有两个特殊的方法,可以获取元素所在单元格的行和列

QTableWidgetItem::方法说明
row()获取元素所在单元格的行
column()获取元素所在单元格的列

样例:通过输入内容,确定新增行或列,以及对应表头

void Widget::on_pushButton_row_clicked()
{int row = ui->tableWidget->rowCount();ui->tableWidget->insertRow(row);const QString& header = ui->lineEdit_row->text();if(!header.isEmpty()){ui->tableWidget->setVerticalHeaderItem(row, new QTableWidgetItem(header));}
}void Widget::on_pushButton_col_clicked()
{int col = ui->tableWidget->columnCount();ui->tableWidget->insertColumn(col);const QString& header = ui->lineEdit_col->text();if(!header.isEmpty()){ui->tableWidget->setHorizontalHeaderItem(col, new QTableWidgetItem(header));}
}

主要信号

信号触发时机
cellClicked(int row,int column)点击单元格时
currentCellChanged(int row,int column,int previousRow,int previousColumn)选中单元格切换时
cellEntered(int row,int column)⿏标进⼊单元格时

TreeWidget

QTreeWidget是一个树形控件,类似于操作系统中的目录结构。QTreeWidget最上层没有根节点,而是由一系列的顶层节点(TopLevelItem)构成,然后再给顶层节点添加子节点,如此往复,最终形成树状结构。

QTreeWidget里的每个元素,都是⼀个 QTreeWidgetItem ,每个QTreeWidgetItem 可以包含多个⽂本和图标,每个⽂本/图标为⼀个列

image-20240712095358357

样例:

image-20240712104615348
void Widget::on_pushButton_topLevel_clicked()
{const QString& text = ui->lineEdit->text();if(!text.isEmpty()){QTreeWidgetItem* newItem = new QTreeWidgetItem();if(newItem){newItem->setText(0, text);ui->treeWidget->addTopLevelItem(newItem);}}// 可以不显式地为新创建的 QTreeWidgetItem 对象设置 parent 指针// 因为 addTopLevelItem 会自动将 newItem 的父指针设置为 treeWidget
}void Widget::on_pushButton_cur_clicked()
{const QString& text = ui->lineEdit->text();if(!text.isEmpty()){QTreeWidgetItem* newItem = new QTreeWidgetItem();if(newItem){newItem->setText(0, text);ui->treeWidget->currentItem()->addChild(newItem);}}
}void Widget::on_pushButton_del_clicked()
{QTreeWidgetItem* cur = ui->treeWidget->currentItem();QTreeWidgetItem* parent = cur->parent();if(parent == nullptr){//顶层节点int index = ui->treeWidget->indexOfTopLevelItem(cur);ui->treeWidget->takeTopLevelItem(index);}else{//非顶层节点parent->removeChild(cur);}
}

容器类控件

GroupBox

使⽤ QGroupBox 实现⼀个带有标题的分组框,可以把其他的控件放到里面作为⼀组,这样看起来能更好看⼀点。

TabWidget

QTabWidget实现一个带有标签页的控件,可以往标签页中设置新的widget,以实现通过切换标签页在不同的widget中跳转。注意,标签页的内容是设置在另外创建的QWidget对象中,QTabWidget只是提供标签页。

主要属性

属性说明
tabPosition标签所在位置
North 上方
South 下方
West 左侧
East 右侧
currentIndex当前选中标签页的下标(从0开始)
currentTabText当前选中标签页的文本
tabsCloseable标签页是否可以关闭
movable标签页是否可以移动

主要方法

方法说明
int addTab(QWidget *page, const QString &label)添加一个新的标签页,page是标签页本体,label是标签页的选项卡文本。返回值是新标签页的编号。
int count()获取标签页的数量
void setCurrentWidget(QWidget *widget)通过QWidget指针,设置当前标签页
void setCurrentIndex(int index)通过标签页编号,设置当前标签页
void removeTab(int index)根据标签页编号,删除标签页

主要信号

信号触发时机
currentChanged(int)标签页切换时,参数为切换后的标签页编号
tabBarClicked(int)点击选项卡的标签条的时候,参数为被点击的选项卡编号
tabCloseRequest(int)tabsCloseable == true时,点击关闭标签页按钮触发,参数为被关闭的标签页编号

样例:实现新增标签页按钮,和点击标签页关闭按钮关闭标签页

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->tabWidget->setTabsClosable(true);QLabel* label = new QLabel(ui->tab);label->setText("这是第一个标签页");label->resize(150,60);QLabel* label_2 = new QLabel(ui->tab_2);label_2->setText("这是第二个标签页");label_2->resize(150,60);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//创建新标签页的Widget,还有标签页文本QWidget* page = new QWidget();int idx = ui->tabWidget->count() + 1;ui->tabWidget->addTab(page, "Tab" + QString::number(idx));//每次创建一个新标签页,自动选中它ui->tabWidget->setCurrentWidget(page);
}void Widget::on_tabWidget_tabCloseRequested(int index)
{ui->tabWidget->removeTab(index);
}
image-20240712114514262

布局管理器

垂直布局

QVBoxLayout是垂直布局管理器。下面是设置垂直布局管理器的demo。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QVBoxLayout* layout = new QVBoxLayout();//创建一个垂直布局管理器this->setLayout(layout);//将layout设置为窗口的布局管理器layout->setContentsMargins(10,20,10,20);//设置布局的左、上、右、下间距layout->setSpacing(50);//设置相邻元素的间距//新建一些按钮QPushButton* button1 = new QPushButton("按钮1");QPushButton* button2 = new QPushButton("按钮2");QPushButton* button3 = new QPushButton("按钮3");//将按钮添加到布局管理器中layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);
}
image-20240715112248092

水平布局

QHBoxLayout水平布局管理器。下面是设置垂直布局管理器的demo。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QHBoxLayout* layout = new QHBoxLayout();//创建一个垂直布局管理器this->setLayout(layout);//将layout设置为窗口的布局管理器layout->setContentsMargins(10,20,10,20);//设置布局的左、上、右、下间距layout->setSpacing(50);//设置相邻元素的间距//新建一些按钮QPushButton* button1 = new QPushButton("按钮1");QPushButton* button2 = new QPushButton("按钮2");QPushButton* button3 = new QPushButton("按钮3");//将按钮添加到布局管理器中layout->addWidget(button1);layout->addWidget(button2);layout->addWidget(button3);//设置拉伸系数,即在布局中所占的权重layout->setStretch(0, 1);layout->setStretch(1, 1);layout->setStretch(2, 2);
}
image-20240715112822430

每个控件(QWidget)只能有一个布局管理器(layout),在QtDesigner中在控件上创建多个layout,实际上内部为每个layout都新建了一个QWidget,再在新建的QWidget上设置layout。如果我们想在一个控件上创建多个layout,可以通过嵌套的方式实现。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QVBoxLayout* vlayout = new QVBoxLayout();//创建一个垂直布局管理器vlayoutthis->setLayout(vlayout);//将vlayout设置为窗口的布局管理器//新建一些按钮QPushButton* button1 = new QPushButton("按钮1");QPushButton* button2 = new QPushButton("按钮2");QPushButton* button3 = new QPushButton("按钮3");QPushButton* button4 = new QPushButton("按钮4");//新建水平布局QHBoxLayout* hlayout = new QHBoxLayout();hlayout->addWidget(button3);hlayout->addWidget(button4);//将按钮添加到布局管理器中vlayout->addWidget(button1);vlayout->addWidget(button2);//将水平布局嵌套到垂直布局中vlayout->addLayout(hlayout);
}
image-20240715113513857

网格布局

QGridLayout是网格布局,实现m * n的二维网格布局效果。

void addWidget(QWidget *, int row, int column)//在网格布局中添加控件

demo

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout* glayout = new QGridLayout();//创建网格布局,视为2行3列this->setLayout(glayout);QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");QPushButton* btn5 = new QPushButton("按钮5");QPushButton* btn6 = new QPushButton("按钮6");glayout->addWidget(btn1, 0, 0);glayout->addWidget(btn2, 0, 1);glayout->addWidget(btn3, 0, 2);glayout->addWidget(btn4, 1, 0);glayout->addWidget(btn5, 1, 1);glayout->addWidget(btn6, 1, 2);//设置列的拉伸系数glayout->setColumnStretch(0,1);glayout->setColumnStretch(1,2);glayout->setColumnStretch(2,1);//设置行的拉伸系数glayout->setRowStretch(0, 1);glayout->setRowStretch(1, 2);
}
image-20240715114704133

上述案例中,直接设置 setRowStretch 效果不明显,因为每个按钮的⾼度是固定的.需要把按钮的垂直⽅向的 sizePolicy 属性设置为 QSizePolicy::Expanding 尽可能填充满布局管理器,才能看到效果,如下:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout* glayout = new QGridLayout();//创建网格布局,视为2行3列this->setLayout(glayout);QPushButton* btn1 = new QPushButton("按钮1");QPushButton* btn2 = new QPushButton("按钮2");QPushButton* btn3 = new QPushButton("按钮3");QPushButton* btn4 = new QPushButton("按钮4");QPushButton* btn5 = new QPushButton("按钮5");QPushButton* btn6 = new QPushButton("按钮6");//设置每个按钮的SizePolicy为 填充btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);btn6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);glayout->addWidget(btn1, 0, 0);glayout->addWidget(btn2, 0, 1);glayout->addWidget(btn3, 0, 2);glayout->addWidget(btn4, 1, 0);glayout->addWidget(btn5, 1, 1);glayout->addWidget(btn6, 1, 2);//设置列的拉伸系数glayout->setColumnStretch(0,1);glayout->setColumnStretch(1,2);glayout->setColumnStretch(2,1);//设置行的拉伸系数glayout->setRowStretch(0, 1);glayout->setRowStretch(1, 3);
}
image-20240715114957928

表单布局

QFormLayout是表单布局管理器,网格布局的一种特殊情况。这种表单布局多用于让用户填写信息的场景,一般只有两列,左侧列为提示,右侧列为输⼊框。通过addRow(QWidget *label, QWidget *field)方法可以向表单布局中添加行。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QFormLayout* flayout = new QFormLayout();this->setLayout(flayout);QLabel* label_name = new QLabel("姓名");QLabel* label_phone = new QLabel("电话");QLabel* label_addr = new QLabel("地址");QLineEdit* lineEdit_name = new QLineEdit();QLineEdit* lineEdit_phone = new QLineEdit();QLineEdit* lineEdit_addr = new QLineEdit();flayout->addRow(label_name, lineEdit_name);flayout->addRow(label_phone, lineEdit_phone);flayout->addRow(label_addr, lineEdit_addr);QPushButton* btn = new QPushButton("提交");flayout->addRow(nullptr, btn);
}
image-20240715115915612

相关文章:

【Qt】常用控件

文章目录 QWidgetenabledgeometrywindow framewindowTitlewindowIconqrc资源管理windowOpacitycursorfonttoolTipfocusPolicystyleSheet 按钮类PushButtonRadioButtonCheckBoxSignals 显示类LabelLCDNumberProgressBarCalendar 输入类LineEditTextEditComboBoxSpinBoxDateTimeE…...

electron 主进程和渲染进程通信

在Electron中,主进程(main process)和渲染进程(renderer process)之间的通信是非常重要的,因为Electron应用通常会将用户界面(由Web技术如HTML, CSS, 和JavaScript构建)和原生功能(如系统对话框、文件I/O等)分开处理。主进程管理应用的生命周期和创建渲染进程,而渲染…...

【ARM】MDK-解决CMSIS_DAP.DLL missing报错

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录解决CMSIS_DAP.DLL missing的报错情况&#xff0c;对应相关报错信息&#xff0c;供后续客户参考&#xff0c;快速解决客户问题。 2、 问题场景 客户进行硬件调试时&#xff0c;发现Target设置内有CMSIS_DAP.DL…...

CSS 的环境变量函数env()

在CSS中&#xff0c;env() 函数并不是传统意义上的“环境变量”函数&#xff0c;如你在编程语言中可能遇到的那样。相反&#xff0c;env() 是CSS中的一个函数&#xff0c;它用于访问由宿主环境&#xff08;如浏览器&#xff09;提供给CSS的自定义属性&#xff08;也称为环境变量…...

数学建模--国赛备赛---TOPSIS算法

目录 1.准备部分 1.1提交材料 1.2MD5码相关要求 2.TOPSIS算法 2.1算法概述 2.2基本概念 2.3算法核心思想 2.4拓展思考 3.适用赛题 3.1适用赛题说明 3.2适用赛题举例 4.赛题分析 4.1指标的分类 4.2数据预处理 4.2.1区间型属性的变换 4.2.2向量规范化 4.3数据加…...

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…...

【Apache Doris】周FAQ集锦:第 16 期

【Apache Doris】周FAQ集锦&#xff1a;第 16 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…...

单例模式_Golang

目录 一、单例模式 1.1 基本概念 1.2 使用场景 二、Golang实现 2.1 懒汉模式&#xff08;Lazy Loading&#xff09; 一、单例模式 1.1 基本概念 一个类只能生成一个实例&#xff0c;且该类能自行创建这个实例的一种模式,这个定义个人感觉可以拆的通俗一些,在项目的生命周…...

代码随想录 day 18 二叉树

第六章 二叉树part06 详细布置 530.二叉搜索树的最小绝对差 需要领悟一下二叉树遍历上双指针操作&#xff0c;优先掌握递归 题目链接/文章讲解&#xff1a;https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%B…...

降雨量预测 | Matlab基于ARIMA-RBF降雨量预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 降雨量预测 | Matlab基于ARIMA-RBF降雨量预测 注&#xff1a;程序和数据放在一个文件夹。 程序语言为matlab&#xff0c;程序可出预测效果图&#xff0c;指标图; 代码特点&#xff1a;参数化编程、参数可方便更改、代…...

包含示例和模板的流程文档指南

当您的业务扩展时&#xff0c;您会得到越来越多的移动部件&#xff0c;并且需要有人来跟踪复杂性。人员和任务需要以尽可能最高效的方式进行组织&#xff0c;并且您必须找到某种方法让员工知道如何执行有效完成工作所需的流程。 为了使流程可重复&#xff0c;需要对其进行记录…...

51单片机嵌入式开发:15、STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒

STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒 1 概述2 蜂鸣器操作方法3 蜂鸣器发出音声4 硬件电路5 软件实现6 整体工程&#xff1a;7 总结 1 概述 要实现一个基于STC89C52RC单片机的音乐盒&#xff0c;可以按照以下步骤进行&#xff1a; &#xff08;1&#xff09;硬…...

B树(B-Tree)数据结构

1. 什么是B树&#xff1f; B树&#xff08;B-Tree&#xff09;是一种多路搜索树&#xff0c;用于存储和检索大量数据。它是自适应的&#xff0c;适用于各种存储设备和各种数据量。B树的特点是高效的搜索、插入和删除操作&#xff0c;且可以在各种情况下保持树的平衡。 2. B树…...

【BUG】已解决:ModuleNotFoundError: No module named ‘torch‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘torch‘ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市…...

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…...

解决GoLand添加GOROOT提示The selected directory is not a valid home for Go Sdk的问题

现象 解决 在Go安装路径下找到zversion.go文件&#xff0c;我的在D:\Program Files\Go1.21.1\src\runtime\internal\sys下面 打开文件&#xff0c;添加如下内容&#xff1a; const TheVersion go1.21.1保存后再重新添加GOROOT即可...

51单片机(STC8H8K64U/STC8051U34K64)_RA8889驱动TFT大屏_I2C_HW参考代码(v1.3) 硬件I2C方式

本篇介绍单片机使用硬件I2C方式控制RA8889驱动彩屏。 提供STC8H8K64U和STC8051U34K64的参考代码。 【硬件部份】STC8H8K64U/STC8051U34K64 RA8889开发板 7寸TFT 800x480 1. 实物连接图&#xff1a;STC8H8K64URA8889开发板&#xff0c;使用P2口I2C接口&#xff1a; 2.实物连…...

【Python其他检查字符串占字节数的方法】

在Python中&#xff0c;检查字符串在特定编码下占用的字节数&#xff0c;最标准且常用的方法是通过字符串的.encode()方法将字符串转换为字节串&#xff0c;然后使用len()函数来获取这个字节串的长度。这是因为字符串&#xff08;在Python 3中&#xff09;是以Unicode形式存储的…...

梧桐数据库: 数据库技术中的重写子查询技术

数据库技术中的重写子查询技术&#xff0c;是数据库查询优化的一种重要手段。该技术主要通过改变子查询的形式&#xff0c;使其在执行效率和性能上得到优化。以下是对重写子查询技术的详细解析&#xff1a; 一、定义与目的 定义&#xff1a;重写子查询技术是指在数据库查询优…...

PHP连接MySQL数据库

PHP本身不具备操作MySQL数据库的能力&#xff0c;需要借助MySQL扩展来实现。 1、PHP加载MySQL扩展&#xff1a;php.ini文件中。&#xff08;不要用记事本打开&#xff09; 2、PHP中所有扩展都是在ext的文件夹中&#xff0c;需要指定扩展所在路径&#xff1a;extension_dir。 3、…...

STM32自己从零开始实操:PCB全过程

一、PCB总体分布 以下只能让大家看到各个模块大致分布在板子的哪一块&#xff0c;只能说每个人画都有自己的理由&#xff1a; 电源&#xff1a;从外部接入电源&#xff0c;5V接到中间&#xff0c;向上变成4V供给无线&#xff0c;向下变成3V供给下面的接口&#xff08;也刻意放…...

error `slot` attributes are deprecated vue/no-deprecated-slot-attribute

旧的代码如下&#xff1a; <template slot"title">{{ item.title }}</template> {{ item.title }} 是一个模板标签&#xff0c;它在模板中插入了一个元素&#xff08;slot&#xff09;&#xff0c;并指定了元素的名称为 “title”。这个标签在模板中显示…...

Websocket自动消息回复服务端工具

点击下载《Websocket自动消息回复服务端工具》 1. 前言 在进行Websocket开发时&#xff0c;前端小伙伴通常是和后端开发人员同步进行项目开发&#xff0c;经常会遇到后端开发人员接口还没开发完&#xff0c;也没有可以调试的环境&#xff0c;只能按照接口文档进行“脑回路开发…...

【软考】UML中的关联关系

目录 一、说明二、具体类型2.1 普通关联2.2 单向关联2.3 双向关联2.4 自关联2.4 聚合关系&#xff08;Aggregation&#xff09;2.5 组合关系&#xff08;Composition&#xff09; 三、关联关系中的多重性 一、说明 1.UML&#xff08;Unified Modeling Language&#xff0c;统一…...

贪吃蛇超精讲(C语言)

前言 如果你还是个萌新小白&#xff0c;那么该项目的攻克过程一定会十分艰难。虽然作者已经将文章尽可能写的逻辑清晰&#xff0c;内容详细。但所谓“纸上得来终觉浅”&#xff0c;在讲到陌生结构和函数时&#xff0c;大家请一定自己动手去敲一遍代码&#xff0c;这很重要&…...

掌握Rust:函数、闭包与迭代器的综合运用

掌握Rust&#xff1a;函数、闭包与迭代器的综合运用 引言&#xff1a;解锁 Rust 高效编程的钥匙函数定义与模式匹配&#xff1a;构建逻辑的基石高阶函数与闭包&#xff1a;代码复用的艺术迭代器与 for 循环&#xff1a;高效数据处理的引擎综合应用案例&#xff1a;构建一个简易…...

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…...

Armpro搭建教程全开源版的教程

Armpro搭建教程 全开源版的教程&#xff0c;其他未知 资源宝整理分享 www.httple.net 首先ssh执行指令安装运行环境 yum install java-1.8.0-openjdk* -y导入文件服务器 导入arm.zip到www目录下然后解压 导入jar包.zip到www目录然后解压 导入basic.zip到www目录然后解压在宝塔…...

nginx基本原理

进程模型 当nginx启动之后&#xff0c;会有一个master进程和多个worker进程。默认是一个worker进程。 master进程的作用&#xff1a;接收来自外界信号&#xff0c;向各worker进程发送信号&#xff0c;监控worker进程的运行状态&#xff0c;当worker进程在异常情况下退出后&am…...

在 CI/CD Pipeline 中实施持续测试的最佳实践!

随着软件开发周期的不断加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;已经成为现代软件开发的重要组成部分。在这一过程中&#xff0c;持续测试的实施对于确保代码质量、提高发布效率至关重要。本文将详细介绍在CI/CD流水线中…...

专业北京网站建设公司/网址导航怎样推广

机器学习机器分支一览&#xff1a;...

广西南宁网站建设/指数工具

首先是用java来实现简单的Server端(http的请求内容格式可以参考msdn:http://msdn.microsoft.com/zh-cn/library/hh202945(vvs.92)): /*** 推送toast通知* param uriString 推送服务通知uri* param title toast标题* param content toast内容* param param 页面跳转参…...

安徽做公司网站哪家好/关键词热度

RT&#xff0c;在Hive中&#xff0c;使用了Group By后&#xff0c;是无法再sort&#xff0c;再取Top K的&#xff0c;我们可以用UDF distributed by sort by 实现这个功能。Assume you have a table with three columns: user, category and value. For each user, you want …...

改图网在线制作图片/网站seo主要是做什么的

来源&#xff1a;数据学堂本文来源于网络&#xff0c;如有侵权&#xff0c;联系浪尖删除&#xff1a;langjianliaodashuju全文共7596个字&#xff0c;建议阅读12分钟由于在变化快速的商业世界里&#xff0c;业务形态多种多样&#xff0c;为了能够更有针对性的进行数据建模&…...

有什么网站可以做编程题/企业推广策略

find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6937 Accepted Submission(s): 2957Problem DescriptionXX星有许多城市&#xff0c;城市之间通过一种奇怪的高速公路SARS(Supe…...

购物网站开发/项目网站

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/qq_25827845/article/details/73565502冷血之心的博客&#xff09; 剑指Offer&#xff08;第二版&#xff09;面试题34&#xff1a;二叉树中和为某一个值的路径 题目&#xff1a;二叉树中…...