我正在尝试在我的gtk浏览器中弹出一个OK消息框,但我得到的只是空白的灰色方形补丁而没有我的文本甚至按钮都不可见。
PFB我用来渲染消息框的函数:
Void DisplayOKPopup()
{
dialogue=gtk_message_dialogue_new(GTK_WINDOW(WebtBrowserWindow),
GTK_DIALOGUE_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"text message");
gtk_widget_show(dialogue);
LOGDEBUG(" 1");
gtk_dialogue_run(GTK_DIALOGUE (dialogue));
LOGDEBUG("2");
gtk_widget_destroy (dialogue);
}
根据我的调试日志,我可以看到控件正在传递到LOGDEBUG("1")
之后,在该UI崩溃之后它会转到gtk_dialogue_run
,即运行旁边的行,即{{1}没有被执行。
请提供您的意见,因为我正在为此工作3天以来:!
答案 0 :(得分:0)
总之,问题源于线程的使用。有几种方法可以解决这个问题,但由于没有代码,我将尝试一个简单的示例,以便您可以在代码上重新创建它。
将一个全局布尔变量作为标志并在您的线程上,将其设置为true,以便"定期"空闲回调可以检查它,如果标志是TRUE
,则显示对话框。逻辑是从主循环/主线程调用Gtk UI函数,而不是从工作线程调用。
DisplayOkPopup
只是有一个简单的"计数器"从0到MAX_INT(32位)并将全局标志设置为TRUE。
check_for_dialog
它是一个在mainloop空闲时间运行的回调并检查标志,如果TRUE
然后运行该对话框。
退出是脏的,会输出错误,但目标不是,这只是解决方案的提示/提示。
示例:强>
#include <gtk/gtk.h>
gboolean dialog_active;
gboolean show_dialog_popup;
GtkWidget *window;
gpointer DisplayOKPopup (gpointer user_data) {
int i;
while (TRUE) {
for (i = 0; i < G_MAXINT32; i++) {
// nop
}
show_dialog_popup = TRUE;
}
return NULL;
}
gboolean check_for_dialog (gpointer user_data) {
if (show_dialog_popup == TRUE && dialog_active == FALSE) {
dialog_active = TRUE;
GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"text message");
gtk_dialog_run(GTK_DIALOG (dialog));
show_dialog_popup = FALSE;
dialog_active = FALSE;
gtk_widget_destroy(dialog);
}
return TRUE;
}
static void app_activate(GtkApplication *app, gpointer user_data) {
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Window Title Here");
gtk_window_set_default_size(GTK_WINDOW(window), 700, 400);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
//gtk_container_add(GTK_CONTAINER(window), fixed);
gtk_widget_show_all(window);
g_idle_add(check_for_dialog, NULL);
g_thread_new("my thread", DisplayOKPopup, NULL);
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
show_dialog_popup = FALSE;
dialog_active = FALSE;
app = gtk_application_new("your.application.id", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
构建并运行
$ gcc -o test test.c `pkg-config --cflags --libs gtk+-3.0`
$ ./test
修改强>:
回答你的评论是:
要在对话框中使用自定义按钮,请使用:
1)的例子:
dialog = gtk_dialog_new_with_buttons ("My dialog",
main_app_window,
flags,
"_OK",
GTK_RESPONSE_ACCEPT,
"_Cancel",
GTK_RESPONSE_REJECT,
NULL);
2)的例子:
gtk_dialog_add_button (GTK_DIALOG(dialog),
"This is my button",
GTK_RESPONSE_ACCEPT);
3)的示例与2)相同,但可以处理许多按钮并以NULL结束。