如何插入进度条以显示运行时进度项目?

时间:2016-12-27 16:28:13

标签: progress-bar gtk3

我的项目有一段运行时间。我用以下代码显示它:

#include <opencv2/opencv.hpp>
#include <gtk/gtk.h>
#include <time.h>

using namespace cv;
using namespace std;

gboolean Func (gpointer data) {
    gdouble value;
    GString *text;

    //part of code that generate run time
    clock_t start, end;
    start = clock();

    Mat image, src1, DENO;
    image = imread("C:/Users/Alireza/Desktop/1.png");
    cvtColor(image, src1, CV_RGB2GRAY);
    fastNlMeansDenoising(src1, DENO, 19, 29, 38);
    imwrite("DENO.png", DENO);

    end = clock();
    int runtime = ((int)(end - start)) / CLOCKS_PER_SEC;
    cout << "Time1 = " << runtime << "s" << endl;


    //part of code that I want to show run time progress by progress bar
    value = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(data));

    value += 0.01;
    if (value > 1.0) {
        value = 0.0;
    }

    text = g_string_new(gtk_progress_bar_get_text(GTK_PROGRESS_BAR(data)));
    g_string_sprintf(text, "%d%%", (int)(value * 100));
    gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(data), value);
    gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(data), TRUE);
    gtk_progress_bar_set_text(GTK_PROGRESS_BAR(data), text->str);

    while (gtk_events_pending())
        gtk_main_iteration();

    return TRUE;
}

int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *progressBar;
gint timer;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkProgressBar");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 30);

progressBar = gtk_progress_bar_new();
timer = g_timeout_add(100, Func, progressBar);

gtk_container_add(GTK_CONTAINER(window), progressBar);

gtk_widget_show_all(window);

gtk_main();

return 0;

}

我希望使用进度条显示我的项目进度。图片是:

1.png

但我无法将这些代码组合在一起以显示项目的进度运行时间。我是gtk3的新手。有没有人对此有任何想法或建议?

1 个答案:

答案 0 :(得分:1)

我认为您的计划还有其他一些问题。关于进度条:

在致电gtk_progress_bar_set_fraction时,您确实更新了进度条,但是您没有给Gtk时间来绘制更新的条形图。 (另外,对gtk_progress_bar_set_fraction的调用应该在for循环中)

因此,为了允许Gtk这样做(并且还要处理其他事件,例如点击和键盘),您必须调用一个允许Gtk主循环处理待处理请求的函数。

查看函数gtk_main_iterationgtk_main_iteration_do。你必须在数学循环中加入一个。