zoukankan      html  css  js  c++  java
  • Qt软件启动界面进度条的设置

    1 、Qt软件启动界面进度条制作

    • 卓面端的启动界面都用到 QSplashScreen 类
    • QSplashScreen 类没有启动进度条进行显示,很不美观,如果要进行进度条的加载,则需要对 QSplashScreen 进行继承改造。
    • 继承后、主要要添加 QProgressBar 进度条这个控件进行设计与样式改造

    2、具体封装的类如下

    class SplashScreen : public QSplashScreen
    {
        Q_OBJECT

    public:
        explicit SplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags f = Qt::WindowFlags());
        ~SplashScreen();
        void getNumbersList();
        void setPixmap(const QPixmap &pixmap);

        static bool updateProgress();
        static void setProgressBarVisible(bool isVisible);

        static bool             m_showProgressBar;
        static QProgressBar     *m_progressBar;
        static QLabel           *m_versionLabel;
        static QLabel           *m_copyrightLabel;
        static QList<int>       m_numbersList;
        static int              m_index;
        static QString          m_progressBarQSS;
    };

    3、代码实现

    SplashScreen::SplashScreen(const QPixmap &pixmap, Qt::WindowFlags f)
    {
        m_index = 0;

        m_progressBarQSS = "QProgressBar {border: none; background: transparent;}"
                           "QProgressBar::chunk {background: #FFFFFF;"
                           "border-top-left-radius: 0px;"
                           "border-top-right-radius: %1px;"
                           "border-bottom-right-radius: %2px;"
                           "border-bottom-left-radius: %3px;}";

        getNumbersList();
    }

    SplashScreen::~SplashScreen()
    {
        if (m_progressBar) {
            delete m_progressBar;
            m_progressBar = Q_NULLPTR;
        }

        if (m_versionLabel) {
            delete m_versionLabel;
            m_versionLabel = Q_NULLPTR;
        }

        if (m_copyrightLabel) {
            delete m_copyrightLabel;
            m_copyrightLabel = Q_NULLPTR;
        }
    }

    void SplashScreen::getNumbersList()
    {
        qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
        for(int i = 0; i <= 20; i++)
        {
            m_numbersList.append(i * 5 + qrand() % 5);
        }
        m_numbersList[0] = 5;

        m_numbersList[m_numbersList.count() - 1] = 100;
    }

    void SplashScreen::setPixmap(const QPixmap &pixmap)
    {
        if (m_showProgressBar) {
            qreal rate = UnitUtil::dpiScale96();

            int height = 8 * rate;

            qreal pr = UnitUtil::pixelRatio();

            m_progressBar = new QProgressBar(this);
            m_progressBar->setTextVisible(false);
            m_progressBar->setGeometry(0, pixmap.height() / pr - height, pixmap.width() / pr, height);
            m_progressBar->setRange(0, 100);
            m_progressBar->setValue(0);

            if (height % 2 == 1) {
                height--;
            }

            int radius = height / 2;

            m_progressBar->setStyleSheet(m_progressBarQSS.arg(0).arg(0).arg(radius - 1 * rate));

            m_progressBarQSS = m_progressBarQSS.arg(0).arg(radius - 1 * rate).arg(radius - 1 * rate);
            QString labelQSS = "QLabel{background: transparent; color: #FFFFFF; border: none;}";
            m_versionLabel = new QLabel(this);
            m_versionLabel->setStyleSheet(labelQSS);
            m_versionLabel->setFont(font);
            m_versionLabel->setText(tr("Version: ") + EDVERSION);

            m_copyrightLabel = new QLabel(this);
            m_copyrightLabel->setStyleSheet(labelQSS);
            m_copyrightLabel->setFont(font);
            m_copyrightLabel->setText(QString("<font>%1</font>").arg(tr("Copyright &#169; %1 EdrawSoft. All rights reserved.").arg(QDate::currentDate().year())));

            m_versionLabel->move(72 * rate, 232 * rate);
            m_copyrightLabel->move(72 * rate, 256 * rate);
        }

        QSplashScreen::setPixmap(pixmap);
    }

    bool SplashScreen::updateProgress()
    {
        if (!m_showProgressBar)
            return false;

        if (m_index >= 0 && m_index < m_numbersList.count()) {
            if (m_progressBar) {
                if (m_numbersList[m_index] == 100) {
                    m_progressBar->setStyleSheet(m_progressBarQSS);
                }

                m_progressBar->setValue(m_numbersList[m_index]);
                m_progressBar->repaint();

            m_index++;

            return true;
        } else {
            if (m_progressBar) {
                m_progressBar->setStyleSheet(m_progressBarQSS);
            }
        }

        return false;
    }

    void SplashScreen::setProgressBarVisible(bool isVisible)
    {
        m_showProgressBar = isVisible;

        if (!m_showProgressBar) {
            if (m_progressBar) {
                delete m_progressBar;
                m_progressBar = Q_NULLPTR;
            }

            if (m_versionLabel) {
                delete m_versionLabel;
                m_versionLabel = Q_NULLPTR;
            }

            if (m_copyrightLabel) {
                delete m_copyrightLabel;
                m_copyrightLabel = Q_NULLPTR;
            }
        }
    }

    4、

    • Qpixmap 的主要作用是设置启动界面的的加载图片或背景。启动界面的窗口大小也是根据PixMap的大小进行设定。
    • updateProgress()这和个函数主要进度条的进度情况。因为是个静态函数,可以在软件进行初始化的地方调用。软件启动每初始化一个地方就调用一下 updateProgress() 更新进度。
  • 相关阅读:
    禁用网络连接后无法访问本机数据库的问题
    DevExpress使用笔记
    DEV控件 皮肤问题
    SQLServer2008导入Excel遇到的问题
    InnoSetup使用笔记
    SQLServer清空数据库中所有表的数据
    MS SQL Server2000转换成MySQL
    由MySQL登录不了引发的一些问题
    onerror事件
    DIV+CSS一些小小的技巧
  • 原文地址:https://www.cnblogs.com/wickhamchen/p/14350081.html
Copyright © 2011-2022 走看看