目录

Qtday5

目录

Qt:day5

一、作业1

将一个 QSlider,使用QSS语句,画成一个进度条:

要画2个部分:QSlider的槽、QSlider滑块;

进度条通过线程自己动起来。

【运行结果】:点Play按钮后,线程运行滑块从最左端向右移动到最右端停止。

https://i-blog.csdnimg.cn/direct/ce2abc6678a744d7b7bfbb9b180ec8a6.png

【Headers / mythread.h】:

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QObject* parent = nullptr);

signals:
    void sendSignal();

protected:
    virtual void run() override;
};

#endif // MYTHREAD_H

【Headers / widget.h】:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QThread>
#include "mythread.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void rcvSignal();

private:
    Ui::Widget *ui;
    myThread* thread;
};
#endif // WIDGET_H

【Sources  / mythread.cpp】:

#include "mythread.h"
#include <QDebug>
#include <QThread>

myThread::myThread(QObject* parent)
    :QThread(parent)
{

}

void myThread::run()
{
    while(!isInterruptionRequested()){ //检测线程是否被请求退出
        emit sendSignal();
        QThread::usleep(100000); // 0.1s
    }
}

【Sources  / widget.cpp】:

#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //QString qss = "QSlider::sub-page{background-color:blue} QSlider::groove:horizontal{background-color:red}";
    QString qss = "QSlider::groove:horizontal { background: gray; } "
                  "QSlider::sub-page:horizontal { background: blue; } "
                  "QSlider::handle:horizontal { background: white; width: 10px; }";

    ui->horizontalSlider->setStyleSheet(qss);
    ui->horizontalSlider->setMaximum(100);

    thread = new myThread(this);
    QObject::connect(thread, &myThread::sendSignal, this, &Widget::rcvSignal);
}

Widget::~Widget()
{
    if(thread){
        thread->quit();
        thread->wait();
        //thread->terminate();
        delete thread;
    }
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    thread->start();
}

void Widget::rcvSignal()
{
    int currentValue = ui->horizontalSlider->value();
    if(currentValue < ui->horizontalSlider->maximum()){
        ui->horizontalSlider->setValue(currentValue + 1);
    }
}

【Sources  / main.cpp】:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}