无法显示 QDialog/QProgressbar
Posted
技术标签:
【中文标题】无法显示 QDialog/QProgressbar【英文标题】:Unable to display QDialog/QProgressbar 【发布时间】:2015-01-17 10:33:15 【问题描述】:我设计了一个应用程序是 C++/Qt 在我的 Mac 和 android 设备之间传输文件。
为此,我创建了一个 QDialog 类,如下所示:
对话框.cpp
Dialog::Dialog(QWidget *parent)
: QWidget(parent)
void Dialog::CreateProgressBar()
ProgressDialog = new QWidget(this);
ProgressDialog->setWindowTitle("Progress");
ProgressLayout = new QVBoxLayout(this);
ProgressIndicator = new QProgressBar();
ProgressIndicator->resize(200,25);
ProgressIndicator->setValue(0);
ProgressIndicator->setOrientation(Qt::Horizontal);
//connect(this,SIGNAL(ProgressBar(const uint64_t, const uint64_t, void const * const)),ProgressIndicator,SLOT(setValue(int)));
CancelButton = new QPushButton();
CancelButton->setFixedSize(25,25);
CancelButton->setText("Cancel");
CancelButton->setFlat(true);
CancelButton->setAutoFillBackground(true);
CancelButton->setStyleSheet("QPushButton background-color : white;");
connect(CancelButton, SIGNAL(clicked()), this, SLOT(onCancelButtonAction()));
ProgressLayout->addWidget(ProgressIndicator);
ProgressLayout->addWidget(CancelButton);
ProgressDialog->setLayout(ProgressLayout);
ProgressDialog->show();
void Dialog::setValue(const uint64_t value)
ProgressIndicator->setValue(value);
void Dialog::DestroyProgressBar()
ProgressDialog->close();
对话框.h
class Dialog : public QWidget
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
/* ProgressIndicator */
//int ProgressBar(const uint64_t data_sent, const uint64_t data_total, void const * const data);
void CreateProgressBar();
void DestroyProgressBar();
int createOverwriteDialogBox(char* filename);
void setValue(const uint64_t value);
void WaitBoxDialog();
void DestroyWaitBoxDialog();
private:
QWidget *ProgressDialog;
QProgressBar *ProgressIndicator;
QVBoxLayout *ProgressLayout;
QPushButton *CancelButton;
为了显示它,我目前有一个名为 wrapper.cpp 的源代码,它负责管理副本。
在管理 Copy 时,在收集 API LIBMTP_Send_File_to_File 之前,我启动方法实例化。
Dialog *MyProgress = new Dialog();
MyProgress->CreateProgressBar();
genfile = LIBMTP_new_file_t();
LIBMTP_Send_File_From_File(PulsDeviceMngr->device, strdup(AbsolutePath), genfile, NULL, NULL);//ProgressBar, MyProgress);
LIBMTP_destroy_file_t(genfile);
MyProgress->DestroyProgressBar();
//delete MyProgress;
我还是不明白为什么我看不到对话框。
【问题讨论】:
有什么理由不能使用内置QProgressDialog? 没有真正的原因。我会尝试。这是我在 Qt 中的第一个应用程序,我从 Internet 上获取了不同的示例来提供帮助。谢谢 【参考方案1】:我认为您需要两个线程,一个用于处理,另一个用于保持 GUI 运行。像这样的:
#include <QFutureWatcher>
#include <QMetaObject>
#include <QtConcurrent/QtConcurrentRun>
void sendFile()
LIBMTP_Send_File_From_File(PulsDeviceMngr->device, strdup(AbsolutePath), genfile, NULL, NULL);
QMetaObject::invokeMethod(MyProgress, "setValue", Q_ARG(int, 50));
LIBMTP_destroy_file_t(genfile);
MyProgress->CreateProgressBar();
QFutureWatcher<void> futureWatcher;
connect(futureWatcher, SIGNAL(finished()), MyProgress, SLOT(DestroyProgressBar()));
futureWatcher.setFuture(QtConcurrent::run(sendFile));
当然,您需要将 setValue 和 DestroyProgressBar 设为公共槽。
【讨论】:
以上是关于无法显示 QDialog/QProgressbar的主要内容,如果未能解决你的问题,请参考以下文章