- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我使用 Qt 设计了一个非常简单的对话框,用于从 youtube 下载视频并将它们转换为 mp4 或 mp3,一切都使用 youtube-dl 命令(我使用 system( ) 调用 youtube-dl)。是的,我是 Linux 用户。它工作正常,但我想在我的 UI 中显示下载进度,就像我直接从那里调用 youtube-dl 时在终端中显示的那样。任何对整个代码的建设性批评将不胜感激。
//ytdialog.h
#ifndef YTDIALOG_H
#define YTDIALOG_H
#include <iostream>
using namespace std;
#include <QDialog>
class QPushButton;
class QLineEdit;
class QLabel;
class ytDialog : public QDialog
{
Q_OBJECT
public:
ytDialog(QWidget *parent = 0);
private slots:
void videoOutput(); //download the video that corresponds to the link in link(QLineEdit)
void audioOutput(); //download the video and converts it to mp3
void enableButtons(); //enable the buttons when link is not empty
private:
QLabel *linkLabel; //Just a Label
QPushButton *video; //Button to Download video
QPushButton *audio; //Button to Download video and convert it to mp3
QLineEdit *link; //Input link
};
#endif
//ytdialog.cpp **Just In case You need it**
#include <QtWidgets>
#include "ytdialog.h"
ytDialog::ytDialog(QWidget *parent)
: QDialog(parent)
{
linkLabel = new QLabel("Link: ");
link = new QLineEdit;
video = new QPushButton("Video Output");
audio = new QPushButton("Audio Output");
link->setMinimumWidth(400);
video->setEnabled(false);
audio->setEnabled(false);
connect(link, SIGNAL(textChanged(const QString &)),
this, SLOT(enableButtons()));
connect(video, SIGNAL(clicked()),
this, SLOT(videoOutput()));
connect(audio, SIGNAL(clicked()),
this, SLOT(audioOutput()));
QHBoxLayout *linkLayout = new QHBoxLayout;
linkLayout -> addWidget(linkLabel);
linkLayout -> addWidget(link);
QHBoxLayout *buttonsLayout = new QHBoxLayout;
buttonsLayout -> addWidget(video);
buttonsLayout -> addWidget(audio);
QVBoxLayout *main = new QVBoxLayout;
main -> addLayout(linkLayout);
main -> addLayout(buttonsLayout);
setLayout(main);
setWindowTitle("Download Youtube");
}
void ytDialog::enableButtons()
{
if (!link->text().isEmpty())
{
video->setEnabled(true);
audio->setEnabled(true);
}
else
{
video->setEnabled(false);
audio->setEnabled(false);
}
}
void ytDialog::videoOutput()
{
string cmd = "youtube-dl -o '/home/rodrigo/Videos/%(title)s.%(ext)s' " + link- >text().toStdString();
system(cmd.c_str());
}
void ytDialog::audioOutput()
{
string cmd = "youtube-dl -x --audio-format mp3 -o '/home/rodrigo/Music/%(title)s.% (ext)s' " + link->text().toStdString();
system(cmd.c_str());
}
最佳答案
您可以使用QProcess
来执行命令。然后您可以使用 readyReadStandardOutput
信号读取槽中的命令输出消息并处理文本以提取进度百分比:
在你的构造函数中:
process = new QProcess();
connect (process, SIGNAL(readyReadStandardOutput()), this, SLOT(readyRead()));
connect (process, SIGNAL(finished (int, QProcess::ExitStatus)), this, SLOT(finished()));
videoOutput
插槽:
void ytDialog::videoOutput()
{
string cmd = "youtube-dl -o '/home/rodrigo/Videos/%(title)s.%(ext)s' " + link- >text().toStdString();
process.start("/bin/sh", QStringList()<< "-c" << cmd);
}
readyRead
插槽:
ytDialog::readyRead()
{
if (!process)
return;
QString str = process->readAllStandardOutput();
//Extract the progress percentage and emit a signal to update the progress bar
...
}
关于c++ - 如何将 QProgressBar 链接到终端进程百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749659/
我正在尝试创建一个 QProgressBar 来指示执行一个我不知道执行前需要多长时间才能完成的操作。 现在我有以下内容 QProgressBar DLbar; DLbar.setMaximum(0)
我更新进度条的第一个天真是在我的循环中包含以下行,它正在执行处理,如下所示: while(data.hasMoreItems()) { doSomeProcessing(data.nextIt
我开发了自己的混合流密码,并且我使用 Qt 作为 GUI。最初我是在一个线程上写的,但它是一个流密码,在对大文件进行操作时使 GUI 功能失调。所以我将加密/解密转移到一个单独的 Qthread。另外
几天,也许几周,我一直在寻找我的应用程序中的内存泄漏。在找到这个之前,我没有找到它的位置: https://bugs.kde.org/show_bug.cgi?id=292217 检查了一切,我发现Q
我的任务很重。我创建了 QProgressBar 来显示该程序仍在工作,并使用 c++ std::thread 类在另一个线程中运行繁重的任务。但是 QProgressBar 不起作用,只有带有 QP
我想要一个垂直进度条,里面有垂直(从上到下)的文本。我想知道是否以及如何使用样式表来实现这一点。我无法更改整个应用程序的样式或完全更改小部件的样式(没有“应用可用的塑料样式解决方案”)。有人可以给我提
我从一个循环(进行一些计算)发出信号,触发位于主 GUI 上的进度条更新,循环结束后进度条更新为 100%(进程结束时进度条隐藏) ,但是有延迟,进度条保持在 100%,有时鼠标变为忙碌,只有几秒钟后
我有一些不寻常的问题:为了可视化打包进度,我考虑使用 qprogressbar 在一个栏中包含两个值 - 一个显示读取的字节,另一个显示写出的字节,这也给出了关于压缩比的想象。 QT4 可以吗? 另外
我正在 QT 中开发一个 GUI,它根据用户输入执行一些繁重的计算。我在一个函数中进行所有计算,比如 start_computation() ,因为 start_computation() 函数被称为
我正在尝试使用进度条 qt creator 作为电池图像,因此我需要能够控制进度条(使用一个名为 my_value 的变量,我将在之后更改该变量)。更准确地说,我希望能够从程序中设置进度条的值,并让它
我有一个日记程序,用户可以在其中创建任务,然后为其添加休息时间。每个 Task 对象都有一个 QTime start_time、QTime end_time 和 Break 的 vector .每个
我正在尝试改变垂直对齐的 QProgressBar 的颜色 我在这里找到了如何通过 setStyleSheet 改变颜色的例子: Changing the color of a QProgressba
我在状态栏中显示进度条,但它并没有很好地对齐。如果可能的话,我希望它显示为中心对齐,或者至少在左侧有一些边距,我正在附上快照。 我遇到的第二个问题是我希望它显示文本但没有显示文本。 _progress
我使用QProgressBar来显示下载操作的进度。我想在显示的百分比中添加一些文本,例如: 10%(下载速度kB/s) 有什么想法吗? 最佳答案 使 QProgressBar 文本可见。 QProg
我有一个 PyQT GUI 应用程序 progress_bar.py,带有一个进度条和一个带有 process_files() 函数的外部模块 worker.py它对文件列表执行一些例程,并使用 pe
我想通过使其变薄来自定义QProgressBar外观。有一个 setMaximumHeight() 方法可用。但不幸的是,进度条的高度被削减(或剪辑),使其看起来很奇怪。相反,我宁愿垂直挤压或缩放它。
我正在使用 QProgressBar并且已经弄清楚如何使用此过程从逻辑层中的特定类发送进度: 在 View 层类中设置连接。 在逻辑层类中创建信号信号。 修改逻辑层类,使其成为 QObject。 调用
我想知道是否有办法自定义进度条的颜色(QtGui.QProgressBar)。假设我们希望在条形图达到 100% 时将其变为绿色。 这是一个工作示例: import sys, time from Py
实际上,我在 QProgressBar 上设置了一个图像,并希望根据 QProgressBar 的选定部分更改图像的颜色。 我尝试用 QProgressBar 颜色覆盖我的图像,但这填充了图像,但由于
我是 Qt 的初学者,我正在尝试为我的应用程序的 gui 显示进程栏。我写了下面的代码 void my_app::progress() { int val=1; while(process.s
我是一名优秀的程序员,十分优秀!