问题标签 [qprogressdialog]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
805 浏览

c++ - 模态 QProgressDialog::setValue() 导致嵌套事件循环崩溃

我刚刚写了一些基于 QThread 的代码来执行一个大的计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式(使用 open()),因为我不想在计算期间允许修改主窗口。线程发出各种信号,允许在 GUI 和线程之间进行基于状态机的通信。

线程的工作对象发出的两个信号是“Progress”和“Finished”。如果发出“Progress”,我将使用 setValue() 更新 QProgressDialog。如果发出“Finished”,则对话框被销毁。

在计算结束时会发生以下情况:

  • 发出“进度”事件 (100%)
  • “完成”后直接发出
  • 由于“进度”事件而调用 setValue(100)
  • 因为对话框是模态的,所以 setValue() 调用 processEvents()
  • processEvents() 传递“Finished”事件
  • “Finished”事件导致 Dialog 在 setValue() 中间被销毁,从而导致崩溃

QProgressDialog 通过在 setValue() 中调用 processEvents() 来破坏我的架构。此外,我的编码约定禁止使用任何嵌套的事件循环(如在 exec() 等中)。

我有两个问题:

  1. 为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。

  2. 是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?

0 投票
2 回答
393 浏览

c++ - 如何在 OS X 上阻止 QProgressDialog 的“本机关闭按钮”?

我正在创建QProgressDialog如下:

请注意,我使用该Qt::WindowCloseButtonHint标志来禁用“本机关闭按钮”。它似乎在Windows上运行良好,但在OS X上却不行(在OS X上,关闭按钮仍然可用,用户可以关闭QProgressDialog)。

我也用其他标志(例如Qt::WindowSystemMenuHintQt::WindowTransparentForInput)进行了测试,但没有一个能解决我的问题。

当然,我可以使用该Qt::FramelessWindowHint标志来删除“窗口的整个边框”,但这不是我的目标,因为我只想禁用关闭按钮。

我可以使用什么窗口标志来禁用/阻止OS XQProgressBar上的关闭按钮?

0 投票
1 回答
1328 浏览

python - QProgressDialog only shows after long-running code is finished

I have a program designed according to the MVC model. My view has an open button where I can open files. The files are parsed and a lot of calculation is done with the file contents.

Now I want to display a loader to indicate that the user should wait. I am totally new to Python and Qt. I am using PyQt5 (Qt 5.6.2) with Python 3.6.2.

I added the showLoader() method to the openFiles() method of my view:

This will display the Loader but it will appear after the file is loaded. Not even immediately after the file is loaded, but it will take an additional 1-2 seconds after everything is done (including some repainting of the Window)

I read a lot about threads so I assume the file parsing is blocking the progress loader which makes sense. I read that I should add the QProgressDialog to a slot (I don't really know what that is) but this doesn't help me because I want the QProgressDialog to be displayed after the QFileDialog.

I also read something about adding QtWidgets.QApplication.processEvents() to repaint the Window, but this didn't work for me (or I used it wrong).

So my questions are:

  1. How do I display the QProgressDialog when I call the showLoader() method?
  2. Do I have to execute my calculations and file parsing in a different thread and if have to how do I do this?
  3. If I wanted to display some more information in the QProgressDialog like updating the text and the progress, how do I do this?

Further Question

The solution pointed out by @ekhumoro works fine. I see the loader and the files are parsed correctly. My problem is now that updating my existing MainWindow does not work.

After executing the code I see a little window popping up but it is disappearing instantly. (I had a problem like this and it was about the C++ garbage collector in the background of Qt. But in my understanding the layout should keep a reference to the ParsedDataWidget so this doesn't make sense for me.) Also the ParsedDataWidget is a widget which should be added to the layout "inline" and not appearing as a "window".

So what do I have to do in order to get the addParsedData method to work?

Edit

I was trying some changings of the code. If I replace the ParsedDataWidget with a QLabel I get the following result:

enter image description here

If i close the window python crashes.

Solution

With some further research I found my problem: You should not use threads with PyQt, you should use SIGNALS instead (written here)

So I changed the code of the worker, I added another SIGNAL called finishedParsing which is emitted if the loading is completed. This SIGNAL holds the DataParser. The could would look like this:

This works now!

0 投票
1 回答
238 浏览

python - PyQt QProgressDialog 没有响应

我是 PyQt(python 接口)编程的新手,我喜欢使用 QProgressDialog 来显示一些任务的进度,所以,问题是,我有这个:

在此处输入图像描述

同时改变进步的价值,谢谢你的帮助

0 投票
0 回答
841 浏览

python - 如何更改 QProgressDialog / QProgressBar 的值文本的颜色?

我正在寻找将值文本的颜色从默认的黑色更改为白色。

在此处输入图像描述

我有一个样式表,但 color: white 似乎只适用于文本,而不适用于值文本。

我也尝试将 QProgressBar 添加到样式表中,但这也没有做任何事情。

这是我的进度对话框代码:

我可以使用 Xprogress.value.setFont() 或其他东西设置值字体颜色吗?

0 投票
2 回答
3697 浏览

c++ - 如何实现 QProgressDialog?

我尝试使用 aQProgressDialog给用户一些关于一个长任务的进度的信息,同时允许他取消这个任务。

基本上,我有一个QDialog带按钮的ComputeQDialog通过单击它,会在 my的父级成员上调用一个耗时的方法。这个方法需要一个回调来告诉调用者工作的进度。

问题是进度对话框在出现之前需要一些时间,并且不会立即考虑单击其Cancel按钮。

很明显我的代码有问题,但是我不习惯 Qt,我尝试了很多东西。我可能需要一个单独的线程。

我的代码摘录:

0 投票
2 回答
1190 浏览

c++ - 从工作线程更新的模态 QProgressDialog

我想从我的工作线程更新模态QProgressDialog。但是,如果我将对话框设置为模态,我的应用程序会崩溃(并且对话框没有显示任何进度)。如果我不这样做,一切都会好起来(但用户可以修改程序的其余部分,这可能会导致问题)。

我究竟做错了什么?

最小代码示例如下:

0 投票
1 回答
1021 浏览

c++ - 如何在 QT 中制作模态 QProgressDialog?

我正在从一个线程调用 QProgressDialog,即使我将 setModal 设置为 true,也无法将其设为模式窗口。我希望在 QProgressDialog 运行时阻止主窗口。

以下是我的一段代码。

通用函数
QProgressDialog *progressBarDialog;

泛型函数.cpp

0 投票
1 回答
254 浏览

c++ - 忙碌模式下的 QProgressDialog 不更新

我有一个简单的循环,我正在执行不确定长度的操作。我设置了一个 QProgressDialogrange(0,0)来触发其不确定的“忙碌”模式;在我的平台上,这通常会产生一个进度条,其手柄来回弹跳。即使精简到以下内容,对话框也会出现,响应“取消”按钮,但句柄在栏的末端被冻结在适当的位置并且不会循环。

显然,循环内部实际上发生了更多事情,但无论有没有内容,它的行为都是一样的;注释掉其他所有内容后剩下的内容与描述的一样。

为什么我的进度手柄没有来回弹跳?

0 投票
0 回答
67 浏览

pyqt5 - PyQT5/QT Designer - 带有信号/插槽的线程

我编写了一个 PyQt5 应用程序,用于在 SQL 数据库中搜索用户输入。一切正常,但我没有运气尝试添加一个工作线程来处理搜索过程并防止应用程序变得无响应。我正在使用 QT Designer 为 UI 生成代码,该代码由主窗口、用于输入的 QLineEdit 框和用于开始搜索的 QPushButton 组成。至于进度条(和用于停止搜索的取消按钮),我正在考虑两个选项:将其“锚定”在主窗口中,或者将其弹出在对话框中。在 QMainWindow 类中,我定义了一个获取用户输入的函数(set_validators)和一个处理搜索并显示结果的函数(save_pushed)。我了解信号/插槽的基础,并且查看了几个示例,但我不确定如何将它们组合在一起。部分问题是我认为的可变范围。任何人都可以提供一般指导吗?

QA1QA2QA3