- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个日记程序,用户可以在其中创建任务,然后为其添加休息时间。每个 Task
对象都有一个 QTime start_time
、QTime end_time
和 Break
的 vector
.每个 Break
都有一个 QTime start_time
和 QTime end_time
成员,就像一个 Task
一样。我想通过使用自定义 QProgressBar
显示“时间线”来可视化当前任务的进度。它应该是一条由红色 block 分隔的绿线,表示中断,上面的三角形表示当前进度。这是我的最高画质:
要求:三角形应该每隔一分钟左右平稳地向终点移动,而不是跳动。它还必须根据它是红色 block 还是绿色 block 来改变颜色。该行必须可以调整大小,但这不应影响 task
或 break
的时间变量。用户不能添加多个休息时间。
现在我的问题是,这可能吗?如果是,那又如何?
我试图不间断地完成一项任务,只画一条绿线和一个没有红色 block 的三角形,但我立即遇到了调整大小的问题。如果线宽增加,那么三角形的每分钟“步长”也应该增加。我尝试实现它,但没有取得多大成功。
这是代码:
//class CustomProgressBar: public QProgressBar
void CustomProgressBar::paintEvent(QPaintEvent* event)
{
setMaximum(this->width());
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QPoint start_point;
start_point.setX(0);
start_point.setY(13);
QPoint end_point;
end_point.setY(13);
end_point.setX(this->width()); //has to be resizable
//"TimeLine"
painter.setPen(QPen(Qt::green, 2, Qt::SolidLine, Qt::RoundCap));
painter.drawLine(start_point, end_point);
//Triangle
int progress = this->value();
QPoint triangle_start_point;
triangle_start_point.setX(this->value() + this->width() / 15 + 1);
triangle_start_point.setY(0);
QPoint triangle_bot_point;
triangle_bot_point.setX(this->value() + this->width() / 15 + 6);
triangle_bot_point.setY(10);
QPoint triangle_top_point;
triangle_top_point.setX(this->value() + this->width() / 15 + 11);
triangle_top_point.setY(0);
QPainterPath path;
path.moveTo(triangle_start_point);
path.lineTo(triangle_bot_point);
path.lineTo(triangle_top_point);
path.lineTo(triangle_start_point);
painter.setPen (Qt :: NoPen);
painter.fillPath(path, QBrush(QColor (Qt::green)));
}
最佳答案
我调整了你的绘画事件并扩展了一些简单的格式来显示休息和运行,看看它。
QList<QPoint> CustomProgessBar::breaks()
{
QList<QPoint> times;
times.append(QPoint(0, 20));
times.append(QPoint(20, 50));
times.append(QPoint(50, 80));
times.append(QPoint(80, 100));
return times;
}
void CustomProgessBar::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QPoint start_point;
start_point.setX(0);
start_point.setY(13);
QPoint end_point;
end_point.setY(13);
end_point.setX(this->width());
//"TimeLine"
for (int i = 0; i < breaks().length(); ++i) {
start_point.setX((int)((float)this->width() / 100 * breaks().at(i).x()));
end_point.setX((int)((float)this->width() / 100 * breaks().at(i).y()));
if (i % 2 == 0) {
painter.setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap));
} else {
painter.setPen(QPen(Qt::green, 2, Qt::SolidLine, Qt::RoundCap));
}
painter.drawLine(start_point, end_point);
}
//Triangle
QPoint triangle_start_point;
triangle_start_point.setX((int)((float)this->width() / this->maximum() * this->value()) - 5);
triangle_start_point.setY(0);
QPoint triangle_bot_point;
triangle_bot_point.setX((int)((float)this->width() / this->maximum() * this->value()) + 0);
triangle_bot_point.setY(10);
QPoint triangle_top_point;
triangle_top_point.setX((int)((float)this->width() / this->maximum() * this->value()) + 5);
triangle_top_point.setY(0);
QPainterPath path;
path.moveTo(triangle_start_point);
path.lineTo(triangle_bot_point);
path.lineTo(triangle_top_point);
path.lineTo(triangle_start_point);
painter.setPen (Qt :: NoPen);
for (int i = 0; i < breaks().length(); ++i) {
int x = (int)((float)triangle_bot_point.x() * 100 / this->width());
if (x >= breaks().at(i).x() && x <= breaks().at(i).y() && i % 2 == 0)
painter.fillPath(path, QBrush(QColor (Qt::red)));
if (x >= breaks().at(i).x() && x <= breaks().at(i).y() && i % 2 == 1)
painter.fillPath(path, QBrush(QColor (Qt::green)));
}
}
提到的跳跃是由于整数运算而发生的。转换为 float 和返回修复了此行为。
也不要尝试将开始和停止时间与图表上的开始和停止点紧密联系起来。在提供的示例中,我有一个生成百分比值的中间步骤。
关于c++ - 自定义 QProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38661229/
我正在尝试创建一个 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
我是一名优秀的程序员,十分优秀!