【问题标题】:How to show Output as a text instead of number?如何将输出显示为文本而不是数字?
【发布时间】:2016-06-16 17:57:34
【问题描述】:

我使用此代码在按钮中打印数字 0 到 11:

colorize_combo = gtk_combo_box_text_new_with_entry();   
for (int i = 0; i <= 2; i += 1)
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("%d", i));
gtk_combo_box_set_active(GTK_COMBO_BOX(colorize_combo), 11);
gtk_table_attach_defaults(GTK_TABLE(table), colorize_combo, 0, 1, 17, 18);

我在 opencv 中使用applyColorMap(unsharp, dstt, type_color),我有 12 种颜色。这些类型的颜色显示为数字(0 到 11)。我想在我的按钮中将输出显示为“文本”而不​​是“数字”。我可以使用“颜色”按钮更改类型颜色。

我只是想改变例如,“0”到“AUTUMN”,“1”到“BONE”,....如果你使用gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("AUTUMN", 0));显示“0”到“AUTUMN”但我想要他们都出现了只有一个gtk_combo_box_text_append_text

我想在我的按钮中将输出显示为“文本”而不​​是“数字”。

"AUTUMN" instead of "0"

"BONE"   instead of "1"

"JET"    instead of "2"

.

.

.

.

"PARULA" instead of "11"

您对如何解决此任务有什么建议?或者我可以在 Internet 上的哪些资源上找到帮助?

这是我的 c++ 代码的一部分:

void incdec2(GtkWidget *widget, const gchar *mode)
{

    else if (!g_strcmp0(mode, "colorized"))
    {

        if (gtk_image_get_pixbuf(GTK_IMAGE(img4)) == NULL)
            return;

        int type_color = atoi(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(colorize_combo)));

        vector< Vec4i > hierarchy;
        int largest_contour_index = 0;
        int largest_area = 0;

        vector< vector <Point> > contours1;
        Mat alpha(src1.size(), CV_8UC1, Scalar(0));
        normalize(alpha, alpha, 0, 250, NORM_MINMAX, CV_8UC3);
        findContours(thresh, contours1, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image
        for (int i = 0; i< contours1.size(); i++) // iterate through each contour.
        {
            double a = contourArea(contours1[i], false);  //  Find the area of contour
            if (a>largest_area){
                largest_area = a;
                largest_contour_index = i;                //Store the index of largest contour
            }
        }
        drawContours(alpha, contours1, largest_contour_index, Scalar(255), CV_FILLED, 8, hierarchy);

        applyColorMap(unsharp, dstt, type_color);

        split(dstt, rgb);
        Mat rgbe[4] = { rgb[0], rgb[1], rgb[2], alpha };
        merge(rgbe, 4, im_color);

        imwrite("Colorized Image.png", im_color);
        gtk_image_set_from_file(GTK_IMAGE(img4), "Colorized Image.png");

    }

}

int main(int argc, char *argv[])
 {
 .
 .
 .
 .
 .

colorize_combo = gtk_combo_box_text_new_with_entry();   
for (int i = 0; i <= 11; i += 1)
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("%d", i));


 //gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("AUTUMN", 0));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("BONE", 1));
// gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("JET", 2));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("WINTER", 3));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("RAINBOW", 4));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("OCEAN", 5));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("SUMMER", 6));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("SPRING", 7));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("COOL", 8));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("HSV", 9));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("PINK", 10));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("HOT", 11));
//gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("PARULA", 12));

gtk_combo_box_set_active(GTK_COMBO_BOX(colorize_combo), 11);
gtk_table_attach_defaults(GTK_TABLE(table), colorize_combo, 0, 1, 17, 18);


but13 = bold_img_button("Color", "E:/Works for Gov Project/DOC/GUI/logogui1/colorize243.png");
gdk_color_parse("#50a0ff", &color);
gtk_widget_modify_bg(but13, GTK_STATE_NORMAL, &color);
gtk_table_attach_defaults(GTK_TABLE(table), but13, 1, 2, 17, 18);
g_signal_connect(G_OBJECT(but13), "clicked", G_CALLBACK(incdec2), "colorized");


 .
 .
 .
 .

 }

例如,我将循环编辑为:

string texts[] = { "AUTUMN", "BONE", "JET" };
int size = sizeof(texts) / sizeof(string);
for (int i = 0; i < size; i++)
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("%s", texts[i]));

但它不能正常工作。

【问题讨论】:

  • 您特别要求将号码显示为带有g_strdup_printf("%d", i) 的号码。字符串是从哪里来的?
  • 为什么这被标记为 OpenCV?我没有看到它的踪迹。
  • @DanMašek OP 似乎只是在标记与其整体项目相关的所有内容;他们最后的几个问题是关于在他们的程序中添加一个关于 OpenCV 对话框,我认为它使用 OpenCV
  • @DanMašek 和 andlabs,我编辑我的问题。
  • 您可以在 for 循环中创建一个字符串数组并为其编制索引。

标签: gtk gtk3 gtkmm gtk2


【解决方案1】:

更新了如何解码组合框中的值

您不需要g_strdup_printfgtk_combo_box_text_append_text 需要const gchar *。这意味着它不会修改你传递的字符串,它会自己创建一个副本。

在文件顶部声明:

static const char *color_names[] = { "AUTUMN", "BONE", "JET" };

然后,在您填写组合框的地方,替换:

string texts[] = { "AUTUMN", "BONE", "JET" };
int size = sizeof(texts) / sizeof(string);
for (int i = 0; i < size; i++)
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), g_strdup_printf("%s", texts[i]));

与:

for (int i = 0; i < G_N_ELEMENTS(texts); i++)
    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(colorize_combo), texts[i]);

最后,在您阅读组合框选择的文本的地方,替换:

int type_color = atoi(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(colorize_combo)));

与:

int type_color = -1;
gchar * selected_color_name = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(colorize_combo));
for (int i = 0; i < G_N_ELEMENTS(color_names); i++)
    if (g_strcmp0(selected_color_name, color_names[i]) == 0)
        type_color = i;

// gtk_combo_box_text_get_active_text return a string that must be freed as stated in the doc
g_free(selected_color_name);

【讨论】:

  • 非常感谢您指导我。但是您的代码只是显示文本并且无法正常工作。我认为是因为在显示的“incdec2”函数中使用了“!g_strcmp0”。
  • “不能正常工作”不是人们期望的那种有用的反馈......你想要文本而不是数字,我认为这部分效果很好,这就是你的问题是关于。
  • 顺便说一句,如果您不将 atoi 调用替换为其他内容,您将无法正确解释组合框中的文本。请记住,组合框不再包含数字。
  • @liberforce,我真的很抱歉我的提及。我喜欢你,非常感谢你指导我。 ......我发现了问题。在函数“applyColorMap(unsharp, dstt, type_color);”中type_color 是一个整数,我认为我们不能用文本显示它们。也许,我们可以用虚拟的方式将它们显示为文本,而不是按钮中的数字。
  • 嘿,别担心,我没有生气,只是在 stackoverflow 上,您针对一个问题提出一个问题。对于您的问题,这就是我上面所说的:atoi 将字符串转换为整数,但无法知道如何将"AUTUMN" 之类的颜色名称转换为整数。只需将 texts 数组声明移动到文件顶部(在其前面添加 static 关键字),然后将 atoi 调用替换为循环,该循环将组合框文本与 @ 的每个可能值进行比较987654335@ 数组。一旦它们匹配,您就知道颜色索引,并将其放入type_color
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多