我已经开发了自己的混合流密码,对于GUI,我使用的是Qt.最初我是在单个线程上编写的,但它是一个流密码,当在大文件上运行时,GUI功能失调.所以我将加密/解密转移到单独的Qthread.为了显示进度,我在GUI上包含了一个标准的QProgressbar.但是当我运行文件I/O时,加密/解密工作完美但进度条没有正确更新.整个操作完成后,进度条突然从0%变为100%,表明在操作过程中没有机会更新.对于代码,我将完成的百分比从FileCrypto发送到主GUI线程到QProgressbar的setValue(int)插槽.由于它不起作用,我还尝试将一个int poitner发送到FileCrypto线程,同时用百分比更新指针并在GUI线程上使用QTimer在本地检查int值的值并更新进度条但仍然我得到了完全相同的结果.
这是我的代码:
FileCrypto类:
#include <QThread>
#include <QFile>
#include <PolyVernam.h> //my algo header
class FileCrypto : public QThread
{
Q_OBJECT
public:
FileCrypto(QString, QString, int);
bool stopIt;
protected:
void run();
signals:
void completed(int);
void msg(QString);
void pathMsg1(QString);
void pathMsg2(QString);
void keyMsg(QString);
private:
QFile src, dest;
QString tag;
int mode;
qint64 length;
PolyVernam pv;
};
Run Code Online (Sandbox Code Playgroud)
代码:
#include <FileCrypto.h>
FileCrypto::FileCrypto(QString input, QString keyFile, int mode)
{
stopIt = false;
this->mode = mode;
src.setFileName(input);
if(mode == 1)
{
emit msg("Current Encryption/Decryption status: Encrypting file... …
Run Code Online (Sandbox Code Playgroud) 我在自定义小部件中继承了QProgressBar,并使用以下代码覆盖了paintEvent方法:
void myProg::paintEvent(QPaintEvent *pe)
{
QProgressBar::paintEvent(pe);
QRect region = pe->rect();
QPainter *painter = new QPainter(this);
QPen *pen = new QPen;
painter->begin(this);
painter->setBrush(Qt::red);
int x = this->x();
int y = this->y();
pen->setWidth(10);
painter->setPen(*pen);
painter->drawLine(x,y,x+100,y);
painter->end();
}
Run Code Online (Sandbox Code Playgroud)
我试图显示一条红线作为起点,看看我可以将自己的修改添加到小部件.但是,这不起作用.我只将小部件视为常规QProgressBar.关于什么可能出错的任何想法?
我正在开发QT中的GUI,它根据用户输入执行一些繁重的计算.我在函数中执行所有计算,比如start_computation(),因为start_computation()函数被称为我的GUI挂起,因为它忙于执行start_computation()函数.所以,我想使用QProgressBar让用户知道GUI正在后台执行某项任务.
在这种情况下实施QProgressBar的最佳方法是什么?
如何在弹出窗口中实现一个进度条,该窗口通过QThread监视来自所谓的 Worker 类(即时间/CPU 消耗任务)的运行函数的进度?
我已经检查了无数示例和教程,但进度条显示在弹出窗口中的事实似乎使一切变得更加困难。我相信我想要的是一件相当简单的事情,但我一直在失败,而且我的想法也用完了。
我有一个我想要实现的例子,它基于这个答案:
import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal, QObject, pyqtSlot
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QHBoxLayout, QProgressBar, QVBoxLayout
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Widget")
self.h_box = QHBoxLayout(self)
self.main_window_button = QPushButton("Start")
self.main_window_button.clicked.connect(PopUpProgressB)
self.h_box.addWidget(self.main_window_button)
self.setLayout(self.h_box)
self.show()
class Worker(QObject):
finished = pyqtSignal()
intReady = pyqtSignal(int)
@pyqtSlot()
def proc_counter(self): # A slot takes no params
for i in range(1, 100):
time.sleep(1)
self.intReady.emit(i)
self.finished.emit()
class PopUpProgressB(QWidget):
def …
Run Code Online (Sandbox Code Playgroud) qprogressbar ×4
qt ×3
c++ ×2
qthread ×2
cryptography ×1
file ×1
pyqt ×1
pyqt5 ×1
python ×1
qt-creator ×1
widget ×1