状态对话框添加到Qt工程(Add status dialog to Qt project)

2019-11-04 03:31发布

我在做开源的文件管理器与加密和解密根据所谓Cryptofm给定的密码文件/文件的能力。 你可以从代码在这里 -第一个版本。 我想补充状态对话框,代表加载屏幕与进度条Dialog::encAll()插槽,之后进度条达到最大值关闭statusdialog。 我发现,我必须首先递归找到该文件夹中的所有文件的总大小(以树视图上下文菜单选项大小) -插槽Dialog::dirSize()使用该功能的帮助下做这个Dialog::getSelectedTreeItemSize()然后设置进度条属性最大值为该值。 所以我需要的东西搬到另一个对话框只是表明进程正在执行总规模计算proccess可能会再次采取了很多的时间。 整个事情应该是这样的,在Windows 7的很多文件粘贴非常大的文件夹的过程。

得到的总大小的过程:

pasteing直到进度条的过程达到的总大小:

问题是,几乎所有的功能,动作和等对话框类实现,我不能使用线程-添加的QThread这样的后Dialog : public QDialog, public QThread在dialog.h(能够实现运行( )方法)的程序给出了一些错误:

C:\ Users \用户尼基\文件\ EncryptionProject \ dialog.cpp:41:错误:C2594: '参数':明确的转换从 '对话框* const的' 到 '的QObject *'

C:\ Users \用户尼基\文件\ EncryptionProject \ dialog.cpp:46:错误:C2594: '参数':明确的转换从 '对话框* const的' 到 '的QObject *'

C:\ Users \用户尼基\文件\ EncryptionProject \ dialog.cpp:51:错误:C2385:“连接”的暧昧访问可以是“连接”在碱“的QObject”或可以是“连接”在碱“的QObject”

而另一位31个错误,那么:

  • 什么是这里最好的选择吗?
  • 我应该使用MVC或其他模式?
  • 我应该使用线程?

Answer 1:

我不明白你的整个问题,但我可以给你一些提示。

错误“暧昧转换”告诉你,C ++是不能转换Dialog* constQObject* 。 通常情况下,你可以通过使用像铸造解决这个问题QObject* o = (QObject*) dialog 。 你也尝试将指针转换为const对象的指针非const对象。 因为这是不可能的const对象从变化而非保护的const对象都没有。 尝试删除const预选赛或将其添加到QObject*

在你的第一个屏幕截图进度条的行为通常被称为“不确定模式”。 您可以通过最低和最高要求值设置为0 achive与QProgressBar这种行为(使用pbar->setMaximum(0)pbar->setMinimum(0)

至于你提到的问题线程:是的,你应该使用一个工作线程复制文件。 使用的UI线程(你可能在你目前的解决方案中使用)的问题是,用户界面将停止respoding用户输入(如移动窗口或按下按钮),你喜欢QProgressBar UI元素可能无法更新和你的进步仍不得对用户可见。 您添加的QThread在一个错误的方式YOUT程序。 您目前继承您的自定义对话框类从QDialog的(多数民众赞成罚款至今)和QThread的(这就是这个问题)。 相反,从QThread的inhereting的,你应该创建一个新的QThread实例new ,然后调用一个方法吧。 你会在网上找到大量的例子。

您可以使用MVC,但它会带给你在你目前的情况只有一点点好处。 您还没有在演绎经典模式,虽然你可以创建一个模型处理文件操作。



Answer 2:

我做了什么。 这不是那么容易像它看起来。 我已经分居在新类的所有执行代码调用threadedController与moveToThread移动它在主窗口到新的线程。 重要的是要注意到,这个类是为了能够使用的信号插槽机制继承QObject的,它没有父在构造函数中,becouse在其他情况下,它不能被移动到新的线程是很重要的。 QWidget的对象不能在新线程移动。 这似乎GUI线程和新线程之间的交际能够通过信号槽机制进行说明。 Qt是使用模型/视图架构。 每个人都可以从下载的第二个版本源和exe 这里 。



文章来源: Add status dialog to Qt project