Qt第三课 ----------输入类的控件属性

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言、C++和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


输入类

  • **作者前言**
  • LineEdit
    • QValidator
  • QTextEdit
    • html 和markdown
    • undoRedoEnable
    • tabstopWidth
    • overwritemode
    • acceptRichText
    • verticalScrollBarPolicy和horizontalScrollBarPolicy
    • 信号函数textChanged()
    • 信号函数selectionChanged()
    • 信号函数cursorPositionChanged
  • QCombo box
  • Spin Box和 QDoubleSpinBox
  • 5 Date Edit & Time Edit
  • Dial
  • QSlider

LineEdit

QLineEdit ⽤来表⽰单⾏输⼊框. 可以输⼊⼀段⽂本, 但是不能换⾏.
相关属性如下:
在这里插入图片描述

在这里插入图片描述
还有一些信号函数
在这里插入图片描述
下面使用一些代码简单的介绍

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    const QRect pointOne = Lineedtifuntion("账号:", "请输入账号",this->geometry().width()/2, this->geometry().height()/2);
    const QRect pointTwo =Lineedtifuntion("密码:", "请输入密码", pointOne.x(), pointOne.y());
    const QRect pointThree = Buttonfuntion("性别:","", pointTwo.x(), pointTwo.y());
    const QRect pointfour = Lineedtifuntion("电话:", "请输入电话号码", pointThree.x(), pointThree.y());
    //登入按钮
    QPushButton* button = new QPushButton("登入", this);
    button->move(QPoint(pointfour.x() , pointfour.y()+50));

}

const QRect Widget::Lineedtifuntion(QString name, QString inpt, int x, int y)
{
    QLabel* label = new QLabel(name,this);
    label->move(x,y+50);
    QLineEdit* lineeditOne = new QLineEdit(this);
    lineeditOne->move(QPoint(label->geometry().x()+50 , label->geometry().y()));
    lineeditOne->setMaxLength(15);
    lineeditOne->setFrame(true);
    lineeditOne->setPlaceholderText(inpt);
    //判断是否为密码
    if("密码:"==name)
        //更换显示模式
        lineeditOne->setEchoMode(QLineEdit::Password);
   lineeditOne->setClearButtonEnabled(true);//显示出自动清理按钮
   //进行电话号码的格式约束
    if("电话:"== name)
           lineeditOne->setInputMask("000-000-000");
    return label->geometry();

}

const QRect Widget::Buttonfuntion(QString name, QString inpt, int x, int y)
{
    QLabel* label = new QLabel(name,this);
    label->move(x,y+50);
    //性别
    QRadioButton* rediobuttonmale = new QRadioButton("男",this);
     rediobuttonmale->move(QPoint(label->geometry().x()+50 , label->geometry().y()));
    QRadioButton* rediobuttonfemale= new QRadioButton("女",this);
    rediobuttonfemale->move(QPoint(rediobuttonmale->geometry().x()+50 , rediobuttonmale->geometry().y()));

    return label->geometry();

}

效果如下:
在这里插入图片描述
这里的演示了setMaxLength(设置最大长度)、setFrame(设置边框),setPlaceholderText(为空时显示的内容),>setEchoMode(显示格式),

其中setClearButtonEnabled(设置清除)的效果如下:
在这里插入图片描述
剩下的就不过多介绍了。

QValidator

还需要注意的是inputMask。这个是一个简单格式约束,上面的代码000-000-000表示只能输入数字,光靠这个还是不行的,这就要使用到正则表达式了
这个正则表达式可以去网上查查
下面我们使用正则表达式来进行验证一下。
首先我们需要进行创建一个QRegExp对象,然后使用验证器进行验证,在Qt中有四种验证器

如图:
在这里插入图片描述
**注意:**QRegularExpressionValidator 在匹配性能上做出了⼀定优化. 但是从使⽤⻆度讲, 和
QRegExpValidator 差别不⼤. 我们使⽤ QRegExpValidator 即可
大致思路就是。 创建一个验证器, 然后验证字符串和正则表达式是否符合
下面就是使用到的QRegExpValidator::validate函数,

在这里插入图片描述
第⼀个参数填写的是要验证的字符串. 由于参数要求是 QString& ⽽不是 const
QString& , 需要把这个变量复制⼀下.
◦ 第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度. (没有
啥实质作⽤)
在这里插入图片描述
这个函数的返回值是一个枚举类型,
如图:
在这里插入图片描述
代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //
    QLineEdit * number = new QLineEdit(this);
    number->setGeometry(50,50,300,100);
    //创建验证按钮
    QPushButton *buttonvalidator =new  QPushButton("验证",this);
    //创建正则表达式对象
    QRegExp regexp("^1\\d{10}\\d$");
    //创建验证器
    QRegExpValidator * validator= new QRegExpValidator(regexp,this);


//    connect(buttonvalidator, &QPushButton::clicked, this, [=]()
//    {
//        number->setValidator(validator);//设置一个内置的验证器,需要返回一个validator对象
//        QString str = number->text();
//        int num = 0;
//        QValidator::State elemest =  number->validator()->validate(str,num);
//        if(elemest == QValidator::Acceptable)
//            qDebug() << "验证通过";
//        else
//            qDebug()<< "验证不通过"<< num << str << elemest;

//    });
    connect(number, &QLineEdit::textEdited, this, [=](const QString &str)
    {
        QString ch =  str;
        int point = 0;
        number->setValidator(validator);
        if(number->validator()->validate(ch, point) == QValidator::Acceptable)
            qDebug() << "验证通过";
        else
            qDebug()<< "验证不通过" << str;
    });

}

效果如下:
在这里插入图片描述
这里的代码主要演示的是判断字符是否符合要求,
下来我们还可以写一段注册页面的设置密码的情况, 就写一个输入的两个密码是否一致

// 输入两串字符是否一致
    //创建两个lineedit
    QLineEdit* passwordOne = new QLineEdit(this);
    QLineEdit* passwordTwo = new QLineEdit(this);
    passwordOne->setEchoMode(QLineEdit::Password);
    passwordTwo->setEchoMode(QLineEdit::Password);

    QRect pos = passwordOne->geometry();
    passwordTwo->move(pos.x(), pos.y()+50);
    connect(passwordOne, &QLineEdit::textEdited, this, [=](const QString &arg)
    {
        (void)arg;
        //获取这个文本
        QString textOne = passwordOne->text();
        //设置验证器
        QRegExp elemest(textOne);
        QRegExpValidator* validator = new QRegExpValidator(elemest, this);
        //给第二行设置内置验证器
        passwordTwo->setValidator(validator);
    });
    connect(passwordTwo, &QLineEdit::textEdited, this,[=](const QString & arg)
    {
        (void)arg;
        QString textTwo = passwordTwo->text();
        int strsize = 0;
        QValidator::State ret =  passwordTwo->validator()->validate(textTwo, strsize);
        if(ret == QValidator::Acceptable)
            qDebug()<< "验证成功";
        else
            qDebug()<< "验证失败";

    });
    //创建一个显示密码按钮
    QCheckBox* Onebutton = new QCheckBox("显示密码",this);
    //密码框
    QLineEdit * passwrodLine = new QLineEdit(this);
    passwrodLine->setEchoMode(QLineEdit::Password);
    passwrodLine->setGeometry(Onebutton->geometry().x(), Onebutton->geometry().y()+100, 200,100);
    connect(Onebutton, &QCheckBox::clicked, this, [=](bool checkedelement)
    {
        if(checkedelement != false)
            passwrodLine->setEchoMode(QLineEdit::Normal);
       else
           passwrodLine->setEchoMode(QLineEdit::Password);
    });

这里的代码是第二行输入框输入的字符数量会受到第一行输入框输入的字符限制的,不会跟我们见到的两行输入框可以随便输入,如果要实现这样的效果, 代码如下:

 connect(passwordOne, &QLineEdit::textEdited, this, [=](const QString &arg)
    {
        (void)arg;
        //获取这个文本
        QString textOne = passwordOne->text();
        QString textTwo = passwordTwo->text();
        if(textOne == textTwo)
            qDebug()<< "验证成功";
        else
             qDebug()<< "验证失败";

    });
    connect(passwordTwo, &QLineEdit::textEdited, this,[=](const QString & arg)
    {
        (void)arg;
        //获取这个文本
        QString textOne = passwordOne->text();
        QString textTwo = passwordTwo->text();
        if(textOne == textTwo)
            qDebug()<< "验证成功";
        else
             qDebug()<< "验证失败";

    });

我们还可以写一个显示密码的代码出来来进一步的演示

 QCheckBox* Onebutton = new QCheckBox("显示密码",this);
    //密码框
    QLineEdit * passwrodLine = new QLineEdit(this);
    passwrodLine->setEchoMode(QLineEdit::Password);
    passwrodLine->setGeometry(Onebutton->geometry().x(), Onebutton->geometry().y()+100, 200,100);
    connect(Onebutton, &QCheckBox::clicked, this, [=](bool checkedelement)
    {
        if(checkedelement != false)
            passwrodLine->setEchoMode(QLineEdit::Normal);
       else
           passwrodLine->setEchoMode(QLineEdit::Password);
    });

QTextEdit

表⽰多⾏输⼊框. 也是⼀个富⽂本 & markdown 编辑器,支持html、markdown和纯文本
如果只是想使用纯文本格式可以使用QPlainText,这两个类是差不多的
属性如下:
markdown :输⼊框内持有的内容. ⽀持 markdown 格式. 能够⾃动的对markdown ⽂本进⾏渲染成 html

html: 输⼊框内持有的内容. 可以⽀持⼤部分 html 标签. 包括 img 和 table 等.
placeHolderText: 输⼊框为空时提⽰的内容
readOnly:是否是只读的
undoRedoEnable:是否开启 undo / redo 功能.,按下 ctrl + z 触发 undo,按下 ctrl + y 触发 redo
在这里插入图片描述
信号函数
在这里插入图片描述

下面我们一一使用代码演示

html 和markdown

这两个属性主要是让文本按照html或者maekdown格式来渲染

QTextEdit* Multiple_Line = new QTextEdit(this);
    Multiple_Line->setHtml("<p>你好呀</p>");

效果如下:
在这里插入图片描述
这里只是演示了html的写法,markdown的写法可以自行探索
需要注意的是,如果我们想要获取到对于的文本,不能直接使用html或者markdown,例如获取html的文本:

 qDebug()<< Multiple_Line->toHtml();

效果如下
在这里插入图片描述
如果想要获取纯文本,可以使用toPlainText()

undoRedoEnable

这个就是可以设置是否可以剪切(undo)和剪切撤回(redo)

Multiple_Line->setUndoRedoEnabled(false);

禁用

tabstopWidth

这个属性就是按下tap键缩进多少个字符,

 Multiple_Line->setTabStopWidth(6);//缩进6个字符

overwritemode

开启覆盖写模式
这个主要是覆盖输入目前的内容,某些编程环境或框架中,这个方法通常用于设置一个对象或组件在处理数据时是否允许覆盖现有的数据。
这里的话实现不了

acceptRichText

这个是用来设置是否可以富文本的
富文本:组件允许用户输入包含格式(如字体、颜色、粗体、斜体等)的文本。这意味着用户可以使用富文本编辑器的功能来格式化他们的文本。

verticalScrollBarPolicy和horizontalScrollBarPolicy

verticalScrollBarPolicy是设置垂直滚动条, horizontalScrollBarPolicy是设置水平滚动条

有三个分别是:
Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认值。
• Qt::ScrollBarAlwaysOff : 总是关闭滚动条。
• Qt::ScrollBarAlwaysOn : 总是显⽰滚动条。

Multiple_Line->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
    Multiple_Line->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

如图:
在这里插入图片描述

信号函数textChanged()

当文本内容被改变就会触发

connect(Multiple_Line, &QTextEdit::textChanged, this, [=]()
    {
        qDebug()<< Multiple_Line->toPlainText();//获取纯文本
    });

效果如下:
在这里插入图片描述

信号函数selectionChanged()

当光标选中的内容触发
下面我们需要使用到一个类
QTextEdit 中包含了⼀个 QTextCursor 对象, 通过这个对象可以获取到当前光标位置和选中
的内容.
textCursor()返回一个 QTextCursor 对象,使用selectedText()可以查看光标选中的内容

 connect(Multiple_Line, &QTextEdit::selectionChanged,this,[=]()
    {
        qDebug()<< "选择的内容:" << Multiple_Line->textCursor().selectedText();
    });

效果如下:
在这里插入图片描述
当我们鼠标左键按住不放,就会不断的认为光标的选择范围不断发生改变,当我们松开,就不会输出

信号函数cursorPositionChanged

光标移动时触发

 connect(Multiple_Line, &QTextEdit::cursorPositionChanged,this,[=]()
    {
        qDebug()<< "选择的内容:" << Multiple_Line->textCursor().selectedText();
    });

如图:
在这里插入图片描述
光标移动就会触发

剩下的信号函数,可以根据自己去实现一下,

QCombo box

这个一个下拉框的类
属性和方法如下:
在这里插入图片描述
在这里插入图片描述

核心信号如下:
在这里插入图片描述
下面我们一一演示代码

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //写一个下拉框,用户可以自己添加
    QComboBox* comboboxOne = new QComboBox(this);
    //
    QLineEdit * valueEdit = new QLineEdit(this);
    QPushButton *addButton = new QPushButton("添加", this);
    valueEdit->move(this->geometry().x()+100, this->geometry().y());
    addButton->move(valueEdit->geometry().x()+500, valueEdit->geometry().y());
    valueEdit->setPlaceholderText("输入要添加的内容");
    comboboxOne->setMaxCount(15);
    //设置用户可以修改
    comboboxOne->setEditable(true);
    connect(addButton, &QPushButton::clicked, this,[=]()
    {
        comboboxOne->addItem(valueEdit->text());
        valueEdit->setText("");
        if(comboboxOne->currentIndex()+1 >= 15)
            qDebug() << "添加失败,已经饱和";
        else
            qDebug()<< "你当前选择的序列号为:" << comboboxOne->currentIndex()+1<< "内容为:"
                    << comboboxOne->currentText();


    });


    comboboxOne->addItem("hello");

}

效果如下:
在这里插入图片描述
这里的代码使用到了curretext 、currentIndex、Editable等方法, 可以很直观的看到效果

下面我们写一些关于信号函数的代码出来看看效果
下面我们需要读取文件, 在C语言中可以使用fopen来打开文件,在C++中可以使用fstream来打开文件
下面是以cpu为中心, 来进行判断使用ifstream还是ofstream的
在这里插入图片描述
代码如下:

 QComboBox* comboboxOne = new QComboBox(this);
    //打开文件
    std::ifstream file("../ComboBox/one.txt");
    //判断文件是否打开成功
    if(!file.is_open())
        qDebug()<< "打开失败";
    else
    {
         qDebug()<< "打开成功";
         //开始读取
         std::string linech;
         while(std::getline(file, linech))//如果读取成功,流的状态将保持良好;如果到达文件末尾或发生错误,流的状态将变为不良
         {
             comboboxOne->addItem(QString::fromStdString(linech));
         }
         file.close();

    }

效果如下:
在这里插入图片描述
QString::fromStdString(linech)中这个函数是把string类型转换成Qstring, 如果想要把Qstring
转换成string, 可以使用toStdString()

Spin Box和 QDoubleSpinBox

这两种属于一种微调框,它是带有按钮的输⼊框. 可以⽤来输⼊整数/浮点数. 通过点击按钮来修改数值⼤⼩.
如图:
在这里插入图片描述
由于这两个是相似的下面就以讲解spinbox为主

属性如下:

QSpinBox 的关键属性包括:

value: 获取或设置当前的整数值。

minimum: 设置允许的最小值。

maximum: 设置允许的最大值。

singleStep: 设置每次增减的步长。

prefix: 设置显示在值前的字符串。

suffix: 设置显示在值后的字符串。

wrap: 设置是否允许循环输入(即超过最大值后回到最小值)。

readOnly: 设置为只读模式,防止用户直接输入。

displayIntegerBase: 设置显示的进制(如十进制或十六进制)。
在这里插入图片描述
在这里插入图片描述
信号函数如下:
在这里插入图片描述

图形化界面如下:
在这里插入图片描述

代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->label->setText("主食");
    ui->label_2->setText("饮料");
    ui->label_3->setText("菜品");
    fileRead("../spinbox/staplefood.txt", ui->comboBox);
    fileRead("../spinbox/drinck.txt", ui->comboBox_2);
    fileRead("../spinbox/dish.txt", ui->comboBox_3);
    ui->spinBox->setRange(1,5);//范围
    ui->spinBox_2->setRange(1,5);
    ui->spinBox_3->setRange(1,5);
    PreFixx(ui->spinBox, "数量:");
    SufFixx(ui->spinBox, "个");
    ui->spinBox->setFixedSize(100,20);





}

Widget::~Widget()
{
    delete ui;
}

void Widget::fileRead(QString fileName, QComboBox*  propre)
{
    if(fileName.isEmpty())
         return;
    //打开文件
    std::ifstream file(fileName.toStdString());
    //判断是否打开成功
    if(!file.is_open())
    {
        qDebug()<< "失败";
        return;
    }
    std::string line;
     //读取
    while(std::getline(file,line))
    {
        propre->addItem(QString::fromStdString(line));
    }


    file.close();



}

void Widget::PreFixx(QSpinBox *element, const QString fix)
{
    element->setPrefix(fix);
}

void Widget::SufFixx(QSpinBox *element, const QString fix)
{
    element->setSuffix(fix);
}

这里采用两者结合,更加清晰的观察,效果如下:
在这里插入图片描述
代码还有一些未使用的函数,可以自行探讨,

信号函数的使用

connect(ui->spinBox, &QSpinBox::textChanged,this, [=](const QString &ch)
    {
        qDebug()<< ch;
    });
    
    void Widget::on_spinBox_valueChanged(int arg1)//通过函数名链接
{
     qDebug()<< arg1;
}

效果如下:
在这里插入图片描述

5 Date Edit & Time Edit

这个是根据SpinBox来进行改造过来的,
注意:使⽤ QDateEdit 作为⽇期的微调框 以及 使⽤ QTimeEdit 作为时间的微调框
属性如下:
date: 获取或设置当前日期。
minimumDate: 获取或设置允许选择的最早日期。
maximumDate: 获取或设置允许选择的最晚日期。
displayFormat: 设置日期在控件中显示的格式,例如 “yyyy-MM-dd”。
calendarPopup: 指示是否在点击控件时显示日历弹出窗口。
timeSpec: 获取或设置时间的规格(如本地时间或 UTC)。
(Qt::LocalTime :显⽰本地时间。
• Qt::UTC :显⽰协调世界时(UTC)。
• Qt::OffsetFromUTC :显⽰相对于UTC的偏移量(时差))

readOnly: 设置控件是否为只读模式。
信号函数如下:
在这里插入图片描述
下面开始演示
代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建时间框
    QDateEdit * DateTime = new QDateEdit(this);
    DateTime->setDisplayFormat("yyyy年MM月dd日");
    DateTime->setTimeSpec(Qt::LocalTime);
}

效果如下:
在这里插入图片描述
需要注意的是,我们选中日期的年份可以进行修改,也可以选择月份进行修改

Dial

表⽰⼀个 旋钮
如同:
在这里插入图片描述

属性如下:
minimum: 获取或设置旋钮的最小值。
maximum: 获取或设置旋钮的最大值。
value: 获取或设置当前旋钮的值。
singleStep: 设置每次调整旋钮时的增量(通常用于按键调整)。
pageStep: 设置每次大步调整旋钮时的增量(通常用于鼠标滚轮)。
notchTarget: 设置旋钮的刻度间隔,决定刻度的分布。
notchesVisible 是否显⽰ 刻度线
wrapping: 设置是否允许旋钮值在达到最大值后回到最小值(布尔值)。
sliderPosition: 获取或设置滑块当前的位置。

信号函数如下:
在这里插入图片描述
下面我们写一个通过旋转按钮来设置窗口的透明度,

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->dial->setWrapping(true);// 允许循环
    ui->dial->setSingleStep(1);// 步长
    ui->dial->setNotchesVisible(true);//显示刻度
    ui->dial->setNotchTarget(10);//刻度与刻度之前的格数
    ui->dial ->setMinimum(0);
    ui->dial->setMaximum(100);
    
    this->setWindowIcon(QIcon(QPixmap(":/img1.png")));
    //添加背景图片
    QPalette paletee;
    paletee.setBrush(QPalette::Background, QBrush(QPixmap(":/img1.png")));
    this->setPalette(paletee);
    this->setAutoFillBackground(true);
}

Widget::~Widget()
{
    delete ui;
}
void Widget::on_dial_valueChanged(int value)
{
    qDebug()<< value;
    //窗口透明度
    this->setWindowOpacity(value/100.0);
}

效果如下:
在这里插入图片描述

QSlider

表⽰⼀个滑动条.
这个和QDila是一样的,QSlider 和 QDial 都是继承⾃ QAbstractSlider , 因此⽤法上基本相同
下面列举出不同的属性
orientation 滑动条的⽅向是⽔平还是垂直
invertedAppearance 是否要翻转滑动条的⽅向
tickPosition 刻度的位置.
tickInterval 刻度的密集程度

下面我们写一段代码控制widget窗口的大小:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QRect coordinate = this->geometry();
    //创建水平滑动条
    QSlider* horizontalSlider = SliderCtreat(Qt::Horizontal);
    //创建垂直滑动条
    QSlider* verticalSlider = SliderCtreat(Qt::Vertical,true);
    horizontalSlider->setMaximum(coordinate.width());
    verticalSlider->setMaximum(coordinate.height());
    horizontalSlider->setSliderPosition(horizontalSlider->maximum());
    verticalSlider->setSliderPosition(horizontalSlider->maximum());
    verticalSlider->move(verticalSlider->x(), verticalSlider->y()+50);
    connect(horizontalSlider, &QSlider::valueChanged, this, [=](int value)
    {
        qDebug() <<"horizontal:"<< value;
        QRect coordinate = this->geometry();
        this->setGeometry(coordinate.x(), coordinate.y(), value, coordinate.height());
    });
    connect(verticalSlider, &QSlider::valueChanged, this, [=](int value)
    {
        qDebug() <<"vertical:"<< value;
        QRect coordinate = this->geometry();
        this->setGeometry(coordinate.x(), coordinate.y(),  coordinate.height(),(value));

    });

}
QSlider *Widget::SliderCtreat(Qt::Orientation a, bool change)
{

     QSlider * slider = new QSlider(this);
     slider->setOrientation(a);//设置滑动条水平或者垂直
     slider->setInvertedAppearance(change);//设置滑动条的滑动方向是否发生改变.
     slider->setSliderPosition(100);
     return slider;

}

如图:
在这里插入图片描述

我们还可以通过设置快捷键来进行控制滑动条的滑动
代码如下:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建两个快捷键
    QShortcut* subShorcurLeft = new QShortcut(this);
    QShortcut* addShorcurrigth = new QShortcut(this);
    subShorcurLeft->setKey(QKeySequence("-"));
    addShorcurrigth->setKey(QKeySequence("+"));
    ui->horizontalSlider->setSingleStep(1);
    ui->horizontalSlider->setMaximum(200);
    connect(subShorcurLeft, &QShortcut::activated, this, [=]()
    {

        ui->horizontalSlider->setSliderPosition(ui->horizontalSlider->value()-1);
        ui->label->setText(QString::number(ui->horizontalSlider->value()));

    });
    connect(addShorcurrigth, &QShortcut::activated, this, [=]()
    {

        ui->horizontalSlider->setSliderPosition(ui->horizontalSlider->value()+1);
        ui->label->setText(QString::number(ui->horizontalSlider->value()));

    });
}

效果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端:Spring、Spring Boot-实例化Bean依赖注入(DI)

文章目录 1. 实例化Bean2. 使用FactoryBean3. 依赖注入(DI)3.1 AutoWired 属性注入(查找顺序&#xff1a;先类型&#xff0c;后名字)3.2 AutoWired 在构造函数&参数上的使用3.3 Inject和Resource 进行依赖注入3.4 Value 进行注入 1. 实例化Bean 默认使用无参构造函数&…

qt QPicture详解

1、概述 QPicture类是Qt框架中的一个重要图形类&#xff0c;它主要用于记录和回放QPainter的绘图指令。这个类能够跨平台、无分辨率依赖地绘制图形&#xff0c;非常适合用于实现打印预览和图像操作等场景。QPicture可以将绘图操作序列化为一种独立于平台的格式&#xff0c;保存…

【计算机网络教程】课程 章节测试1 计算机网络概述

一. 单选题&#xff08;共16题&#xff09; 1 【单选题】以下关于TCP/IP参考模型缺点的描述中&#xff0c;错误的是&#xff08; &#xff09;。 A、在服务、接口与协议的区别上不很清楚 B、网络接口层本身并不是实际的一层 C、它不能区分数据链路和物理层 D、传输层对…

金融标准体系

目录 基本原则 标准体系结构图 标准明细表 金融标准体系下载地址 基本原则 需求引领、顶层设计。 坚持目标导向、问题导向、结果 导向有机统一&#xff0c;构建支撑适用、体系完善、科学合理的金融 标准体系。 全面系统、重点突出。 以金融业运用有效、保护有力、 管理高…

Linux练习作业

1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份 环境准备 主从服务器都需要进行的操作#关闭防火墙、SELinnux systemctl stop firewalld setenforce 0#软件安装 yum install bind -y实验一&#…

【STL_list 模拟】——打造属于自己的高效链表容器

一、list节点 ​ list是一个双向循环带头的链表&#xff0c;所以链表节点结构如下&#xff1a; template<class T>struct ListNode{T val;ListNode* next;ListNode* prve;ListNode(int x){val x;next prve this;}};二、list迭代器 2.1、list迭代器与vector迭代器区别…

《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当

1、论文地址Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution 2、Qwen2-VL的Github仓库地址 该论文发表于2024年4月&#xff0c;是Qwen2-VL的续作&#xff0c;截止2024年11月&#xff0c;引用数24 文章目录 1 论文摘要2 引言3 实验3.…

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveQing视频点播流媒体RTMP推流服务功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、鉴权直播2、视频点播3、RTMP推流视频直播和点播流媒体服务 1、鉴权直播 云直播服务-》鉴权直播 -》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中…

Zypher Research:服务器抽象叙事,GameFi 赛道的下一个热点?

继链抽象、账户抽象的概念后&#xff0c;Zypher Network 进一步提出了服务器抽象的概念&#xff0c;并基于 zk 技术率先推出了应用于 Web3 游戏领域的服务器抽象方案。基于该方案&#xff0c;游戏开发者能够在完全去中心化的环境下创建、运行游戏&#xff0c;而不需要依赖传统的…

【SpringCloud详细教程】-01-一文了解微服务

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

在使用 AMD GPU 的 PyTorch 中实现自动混合精度

Automatic mixed precision in PyTorch using AMD GPUs — ROCm Blogs 随着模型规模的增加&#xff0c;训练它们所需的时间和内存——以及因此而产生的成本——也在增加。因此&#xff0c;采取任何措施来减少训练时间和内存使用都是非常有益的。这就是自动混合精度&#xff08;…

基于布局的3D场景生成技术:SceneCraft

1. 概述 随着室内设计和虚拟现实技术的快速发展,快速生成高质量的3D室内场景成为行业需求的重要方向。SceneCraft是一种新型的3D场景生成技术,旨在根据用户提供的布局和文本描述,一键生成详细的室内3D场景。该技术不仅简化了设计流程,还大大提高了设计效率和用户体验。 2…

【Python爬虫实战】深入解析 Selenium:从元素定位到节点交互的完整自动化指南

#1024程序员节&#xff5c;征文# &#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 前言 Selenium 是进行网页自动化操作的强大工具&#xff0c;在测试、数据抓取、用户行…

数据库->联合查询

目录 一、联合查询 1.联合查询 2.多表联合查询时MYSQL内部是如何进⾏计算的 3.多表联合查询 3.1语法 3.2指定多个表&#xff0c;进行联合查询 3.3通过表与表中的链接条件过滤掉无效数据 3.4通过指定列查询&#xff0c;精简查询结果​编辑 3.5可以通过给表起别名的方式&…

k8s知识点总结

docker 名称空间 分类 Docker中的名称空间用于提供进程隔离&#xff0c;确保容器之间的资源相互独立。主要分类包括&#xff1a; PID Namespace&#xff1a;进程ID隔离&#xff0c;使每个容器有自己的进程树&#xff0c;容器内的进程不会干扰其他容器或主机上的进程。 NET Nam…

C++11(1)——右值引用、统一初始化、C++发展史

一、C的发展史 1.C的产生 C的起源可以追溯到1979年&#xff0c;当时本贾尼&#xff08;C创始人&#xff09;在贝尔实验室从事计算机科学与软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发工作&#xff0c;他感受到了现有语言&#…

计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

javascript-Web APLs (三)

事件流 指的是事件完整执行过程中的流动路 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是使用事件冒泡为主 事件…

11.Three.js使用indexeddb前端缓存模型优化前端加载效率

11.Three.js使用indexeddb前端缓存模型优化前端加载效率 1.简述 在使用Three.js做数字孪生应用场景时&#xff0c;我们常常需要用到大量模型或数据。在访问我们的数字孪生应用时&#xff0c;每次刷新都需要从web端进行请求大量的模型数据或其他渲染数据等等&#xff0c;会极大…

keepalive+mysql8双主

1.概述 利用keepalived实现Mysql数据库的高可用&#xff0c;KeepalivedMysql双主来实现MYSQL-HA&#xff0c;我们必须保证两台Mysql数据库的数据完全一致&#xff0c;实现方法是两台Mysql互为主从关系&#xff0c;通过keepalived配置VIP&#xff0c;实现当其中的一台Mysql数据库…