Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使窗口显示在一行中单元格渲染器的正下方_C_Gtk_Gtk2_Gtktreeview - Fatal编程技术网

C 如何使窗口显示在一行中单元格渲染器的正下方

C 如何使窗口显示在一行中单元格渲染器的正下方,c,gtk,gtk2,gtktreeview,C,Gtk,Gtk2,Gtktreeview,我有一个程序可以在GtkEntry(代码)下打开一个窗口。当程序运行时,这是它的窗口: 当我点击“打开”按钮时,一个未装饰的窗口将正好在入口下方打开,其左侧与入口左侧对齐: 它是按钮的以下回调方法的结果,该方法接收条目作为回调参数: bool on_button_clicked(GtkWidget *button, gpointer data) { GtkWidget *entry = data, *subwindow = gtk_window_new(GTK

我有一个程序可以在
GtkEntry
(代码)下打开一个窗口。当程序运行时,这是它的窗口:

当我点击“打开”按钮时,一个未装饰的窗口将正好在入口下方打开,其左侧与入口左侧对齐:

它是按钮的以下回调方法的结果,该方法接收条目作为回调参数:

bool on_button_clicked(GtkWidget *button, gpointer data) {
    GtkWidget *entry = data,
            *subwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL),
            *sublabel = gtk_label_new("This is a rather long message\n"
                    "with many lines whose mere purpose is\n"
                    "to test some stuff. It will appear in \n"
                    "the RIGHT PLACE.");
    gtk_container_add(GTK_CONTAINER(subwindow), sublabel);
    gtk_window_set_decorated(GTK_WINDOW(subwindow), FALSE);
    gtk_window_set_modal(GTK_WINDOW(subwindow), TRUE);


    GtkWidget *window = gtk_widget_get_toplevel(entry);
    gtk_window_set_transient_for(
            GTK_WINDOW(subwindow), GTK_WINDOW(window));

    gint dx, dy;
    gtk_window_get_position(GTK_WINDOW(window), &dx, &dy);

    GtkAllocation allocation;
    gtk_widget_get_allocation(entry, &allocation);

    gtk_window_move(
            GTK_WINDOW(subwindow), 
            allocation.x+dx, allocation.y+allocation.height*2+dy);

    gtk_widget_show_all(subwindow);
    return false;
}
我想在从表视图开始编辑单元格时做类似的事情,特别是当单元格位于第二列时。未装饰的窗口应显示在编辑单元的正下方,并与其左侧对齐。因此,我创建了一个对
“editing start”
事件的回调,假设回调的
editable
参数是一个小部件:

static bool on_cell_renderer_text_editing_started(
        GtkCellRenderer *renderer, GtkCellEditable *editable, 
        gchar *path, gpointer data) {
    GtkWidget *subwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL),
            *sublabel = gtk_label_new("This is a rather long message\n"
                    "with many lines whose mere purpose is\n"
                    "to test some stuff. It will appear in\n"
                    "the WRONG PLACE!");
    gtk_container_add(GTK_CONTAINER(subwindow), sublabel);
    gtk_window_set_decorated(GTK_WINDOW(subwindow), FALSE);
    gtk_window_set_modal(GTK_WINDOW(subwindow), TRUE);

    GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(editable));
    gtk_window_set_transient_for(
            GTK_WINDOW(subwindow), GTK_WINDOW(window));

    gint dx, dy;
    gtk_window_get_position(GTK_WINDOW(window), &dx, &dy);

    GtkAllocation allocation;
    gtk_widget_get_allocation(GTK_WIDGET(editable), &allocation);

    gtk_window_move(
            GTK_WINDOW(subwindow),
           allocation.x+dx, allocation.y+allocation.height*2+dy);
    gtk_widget_show_all(subwindow);
    return false;
}
结果不是我所期望的。未装饰的窗口出现在不同的位置,通常在屏幕的左上角:

此外,我还得到了以下警告(很有启发性,但没有出路):

(条目下的测试子窗口:32300):Gtk临界**:IA__Gtk_窗口_获取_位置:断言“Gtk_是_窗口(窗口)”失败

我尝试了其他一些方法(例如,使用
gdk_window\u get_geometry()
)获取第一个窗口的尺寸),但没有一种方法奏效(我并不感到惊讶,因为它们只是盲目尝试)

那么,如何在特定的单元格渲染器下打开未装饰的窗口呢?

+1,漂亮的图像:)。。。很少观察到,警告意味着传递到
gtk\u window\u get\u position
的参数不是
GtkWindow
。尝试打印出
窗口
值(
%p
)。另外,请检查回调中
dx
dy
allocation
成员的值。另一个检查可能是将主窗口作为数据传递给启动的单元格渲染器文本编辑窗口上的
,并使用该窗口代替
gtk\u小部件获取窗口。请注意,
gtk_widget\u get_window
返回一个
GdkWindow
,这可能不是您想要的。(通过将窗口传递给回调,您将至少在窗口附近有一个弹出窗口)