gpt4 book ai didi

c++ - Qt5:如何使用 State 正确设置 ProgressBar

转载 作者:行者123 更新时间:2023-11-28 01:14:18 26 4
gpt4 key购买 nike

我有一个 ProgressBar 的小例子,当它完成循环执行时应该通知用户计算完成。具体来说,在 ProgressBar 完成后,Text 应该从 Connecting... 变为 Connected

问题 是,一旦 ProgressBar 到达计算结束,文本就不会改变。我认为问题可能在于我如何设置 ProgressBarfinished 函数。在过去的几个小时里,我一直在尝试解决这个问题,但有一些我无法捕捉到的错误。

下面是最重要的代码部分:

progressbardialog.h

class ProgressBar : public QObject
{
Q_OBJECT
Q_PROPERTY(float progress READ progress NOTIFY progressChanged)
Q_PROPERTY(bool running READ running NOTIFY runningChanged)
Q_PROPERTY(bool finished READ finished NOTIFY finishedChanged)
public:
ProgressBar();
float progress();
bool running();
bool finished();

public Q_SLOTS:
void startComputation();
void cancelComputation();
void finishComputation();
private Q_SLOTS:
void updateProgress(int value);
signals:
void progressChanged();
void runningChanged();
void finishedChanged();
private:
bool m_running = false;
int m_progressValue = 0;
int m_finished = true;
QVector<int> vector;
QObject m_Model;
QFutureWatcher<void> m_futureWatcher;
};

progressbardialog.cpp

ProgressBar::ProgressBar()
{}

void spinEC(int &iteration)
{
Q_UNUSED(iteration)
const int work = 1000 * 1000 * 400;
volatile int v = 0;
for(int j = 0; j < work; ++j)
++v;
}

float ProgressBar::progress()
{
return m_progressValue;
}

bool ProgressBar::running()
{
return m_running;
}

bool ProgressBar::finished()
{
return m_finished;
}

void ProgressBar::startComputation()
{
m_running = true;
emit runningChanged();
// Prepare the vector
vector.clear();
for(int i = 0; i < 40; ++i)
vector.append(i);
const QFuture<void> future = QtConcurrent::map(vector, spinEC);
m_futureWatcher.setFuture(future);
connect(&m_futureWatcher, &QFutureWatcher<void>::progressValueChanged,
this, &ProgressBar::updateProgress);
}

void ProgressBar::cancelComputation()
{
m_running = false;
emit runningChanged();
}

void ProgressBar::finishComputation()
{
m_progressValue = false;
emit progressChanged();
}

void ProgressBar::updateProgress(int value)
{
m_progressValue = value;
emit progressChanged();
}

ma​​in.qml

Text {
id: connected
text: qsTr("Not-Connected")
color: "red"
font.pointSize: 15
horizontalAlignment: Text.AlignRight
Layout.fillWidth: true

states: [
State {
name: "connecting"
when: pBar.running
PropertyChanges {
target: connected
text: qsTr("Connecting...")
color: "blue"
font.bold: true
}
},
State {
name: "connected"
when: pBar.finished
PropertyChanges {
target: connected
text: qsTr("Yes! Connected...")
color: "green"
font.bold: true
}
}
]
}

编辑:

progressbar.cpp 上,我还在函数 void ProgressBar::finishComputation() 中尝试了以下操作,但它也没有用:

void ProgressBar::finishComputation()
{
m_progressValue = false;
emit finishedChanged();
}

到目前为止我所做的 是尽可能多地调试代码并且在逐行调试之后(我找不到并决定逐行进行)我发现了问题所在在与我编写的finished 函数相关的Q_PROPERTY 上。runningprogress 等所有其他函数都运行良好,并将相同的理念应用于 finished 函数以通知计算结束因此,将 TextState 从 A 更改为 B。

我在 Progressbar 中遗漏了什么导致我无法完成练习?感谢您阐明此事。

最佳答案

问题可能是 m_finished 在您的 header 中用 true 初始化:

int m_finished = true;

因此,当计算完成后发出信号时,QML 不会检测到任何变化,因为变量仍然为真!

在开始计算之前尝试将其更改为 false。也不要忘记在每次运行或完成更改值时发出更改的信号:

void ProgressBar::startComputation()
{
m_running = true;
emit runningChanged();

m_finished = false;
emit finishedChanged();

...
}

void ProgressBar::finishComputation()
{
m_finished = true;
emit finishedChanged();

m_running = false;
emit runningChanged();
}

编辑:

问题是永远不会调用 finishComputation!一个可能的解决方案是在您的 updateProgress 函数中添加一个检查:

void ProgressBar::updateProgress(int value)
{
m_progressValue = value;
emit progressChanged();

if (m_progressValue == 40)
finishComputation();
}

enter image description here

关于c++ - Qt5:如何使用 State 正确设置 ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com