日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt使用动画提示正在载中

發布時間:2024/9/27 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt使用动画提示正在载中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當程序加載較慢的時候,為了告知用戶正在加載,需要在界面上顯示正在加載中的提示。下面簡單說一下自己使用中出現的問題。

一、在主線程中使用動畫加載

創建基于qapplication的項目,以qdialog類為基類,有.ui文件。
項目的結構如下圖所示:

需要自己在網上找一些加載中的動圖存入gifs文件夾中,建立項目后,向項目中添加資源文件,即添加新文件-》添加qt資源文件-》添加資源文件的文件夾名(這里填寫的是qrc)-》向其中添加前綴,添加文件,再保存。
下面是創建的一個小的demo,直接上代碼。
main.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec(); }

上面的main.cpp采用的是自動生成的文件,未做任何改動。
dialog.h

#ifndef DIALOG_H #define DIALOG_H#include <QDialog> #include <QLabel> #include <QMovie>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void loadingGif(); private:Ui::Dialog *ui;QLabel * m_label;QLabel * m_textLabel;QMovie * m_movie; }; #endif // DIALOG_H

dialog.cpp

#include "dialog.h" #include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);loadingGif(); }Dialog::~Dialog() {m_movie->stop();if(m_movie != nullptr){delete m_movie;m_movie = nullptr;}delete ui; }void Dialog::loadingGif() {m_label = new QLabel(this);m_textLabel = new QLabel("正在加載......",this);m_label->setGeometry(150,130,120,120);m_textLabel->setGeometry(150,250,120,40);m_movie = new QMovie(":/new/prefix1/gifs/771.gif");m_label->setScaledContents(true);//縮放label使其適應其內容m_label->setFixedSize(120,120);m_label->setMovie(m_movie);m_movie->start(); }

以上便是項目的源文件,運行程序后效果如下。

編譯環境為:qtcreate5.13.2,編譯器為MinGW32位。

二、通過子線程使用動畫加載

也是創建基于qapplication的應用程序,基類位qdialog,包含ui文件。
文件的結構如下:

具體的代碼如下:
mian.cpp

#include "dialog.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec(); }

dialog.h

#ifndef DIALOG_H #define DIALOG_H#include "hintthread.h" #include <QDialog> #include <QLabel> #include <QMovie> #include <QVBoxLayout>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void diaplayHintMark();//顯示正在更新的動畫 public slots:void slot_displayHintMark(); private:Ui::Dialog *ui;QLabel * m_label;QMovie * m_movie;QLabel * m_textLabel;QVBoxLayout * m_layout;hintThread * m_thread; }; #endif // DIALOG_H

dialog.cpp

#include "dialog.h" #include "ui_dialog.h" #include <QDebug> #include <QPalette>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog) {ui->setupUi(this);// this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowMinimizeButtonHint);QPalette palette(this->palette());palette.setColor(QPalette::Background, QColor(16,48,155,255));this->setPalette(palette); // this->setAttribute(Qt::WA_TranslucentBackground);//創建線程,子線程更新提示m_thread = new hintThread(this);m_thread->start();// diaplayHintMark(); }Dialog::~Dialog() {m_movie->stop();if(m_movie != nullptr){delete m_movie;m_movie = nullptr;}if(m_thread->isRunning()){m_thread->quit();m_thread->wait();if(m_thread != nullptr){delete m_thread;m_thread = nullptr;}}else{if(m_thread != nullptr){delete m_thread;m_thread = nullptr;}}delete ui; }void Dialog::diaplayHintMark() {qDebug()<<"開始加載";//ui->insideWidgetm_label = new QLabel(this/*,Qt::WindowStaysOnTopHint*/);m_movie = new QMovie(":/new/prefix1/gifs/771.gif");m_label->setGeometry(QRect(100,100,120,120));m_label->setFixedSize(120,120);m_label->setScaledContents(true);m_label->setMovie(m_movie);m_textLabel = new QLabel("努力加載中,請稍后.....",this);m_textLabel->setGeometry(100,220,300,40);m_label->show();//沒有調用顯示函數m_textLabel->show();m_movie->start();qDebug()<<"你好。。。。!";qDebug()<<"what should i do。。。。!"; }void Dialog::slot_displayHintMark() {diaplayHintMark(); }

hintthread.h

#ifndef HINTTHREAD_H #define HINTTHREAD_H#include <QThread>class Dialog; class hintThread : public QThread { Q_OBJECT public:hintThread(Dialog * dlg);hintThread(QObject* parent = 0); signals:void signalDisplayHintMark(); public slots:void slot_displayHintMark(); protected:void run(); private:Dialog * m_dlg; }; #endif // HINTTHREAD_H

hintthread.cpp

#include "hintthread.h" #include "dialog.h"hintThread::hintThread(Dialog * dlg) :QThread() {m_dlg = dlg;//以下兩種信號槽綁定都可以 // connect(this,SIGNAL(signalDisplayHintMark()),m_dlg,SLOT(slot_displayHintMark()));connect(this,SIGNAL(signalDisplayHintMark()),this,SLOT(slot_displayHintMark())); }hintThread::hintThread(QObject* parent): QThread(parent) {}void hintThread::slot_displayHintMark() {m_dlg->diaplayHintMark(); }void hintThread::run() {emit signalDisplayHintMark(); }

程序的運行效果和上面類似 。第二個例子中通過創建子線程時傳入主線程的指針,在子線程中發出信號,通過主線程指針調取主線程ui中的函數。上面第二個例子中,diaplayHintMark()函數未調用兩個label的show()顯示時,無法正常的顯示,此時,函數中label也已設置了父窗口,但沒法顯示。在第一個例子中,也只是設置了label的父窗口,沒有調用show(),可以顯示,沒想明白是什么原因,望知情者告知。

總結

以上是生活随笔為你收集整理的qt使用动画提示正在载中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。