问题描述
我正在尝试使用 GTK3 用 C 语言编写我的第一个程序。 我的目标是创建一个应用程序窗口,里面有一个盒子(主盒子)。在这个框中有一个带有树视图的滚动窗口和这个滚动窗口下的一些按钮。如果我单击一个按钮,该框将被销毁并创建一个新框,用于创建或修改一些数据,以便稍后在 Treeview 中显示。从这个新窗口可以返回到主窗口。当用户想要返回时,实际的盒子将被销毁并再次创建第一个(主盒子)。 当程序启动并第一次创建主框时,滚动窗口将正确调整大小,因为 gtk_scrolled_window_get_propagate_natural_height 设置为 TRUE。当我销毁容器,创建一个新的容器,然后在主框中再次返回(销毁实际的并再次创建第一个)时,滚动窗口的大小是错误的并且只显示一行(滚动条处于活动状态)。 这是我的代码:
main.c
#include <gtk/gtk.h>
#include "general.h"
int main(int argc,char *argv[]){
GtkApplication *app;
int status;
app = gtk_application_new ("emergencyroom",G_APPLICATION_FLAGS_NONE);
g_signal_connect (app,"activate",G_CALLBACK (create_mainwin),NULL);
status = g_application_run (G_APPLICATION (app),argc,argv);
g_object_unref (app);
return status;
}
主窗口功能
void create_mainwin(GtkApplication* app,gpointer user_data){
//stMainwin *widgets = g_slice_new(stMainwin);
GtkWidget *main_win;
main_win = gtk_application_window_new(app);
gtk_window_set_decorated(GTK_WINDOW(main_win),TRUE);
gtk_window_set_position(GTK_WINDOW(main_win),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(main_win),1024,768);
gtk_window_maximize(GTK_WINDOW(main_win));
gtk_window_set_title(GTK_WINDOW(main_win),"Emergency Room 1.0");
g_signal_connect(G_OBJECT (main_win),"delete-event",G_CALLBACK(close_main),main_win);
g_signal_connect(G_OBJECT(main_win),"draw",G_CALLBACK(gtk_widget_queue_draw),NULL);
gtk_widget_show_all(main_win);
main_Box(main_win);
}
主箱功能
void main_Box(GtkWidget *main_win){
enum{
SVNR,Vorname,Nachname,Datum,//NOME,N_COLUMNS
};
GtkWidget *trMain;
GtkTreeViewColumn *column;
GtkTreeIter iter;
GtkBuilder *builder ;
builder = gtk_builder_new();
gtk_builder_add_from_file (builder,"/home/carlo/Nextcloud/FH/HWSE2/HWSE-Projekt/hwse/main_Box.glade",NULL);
stMainwin *widgets = g_slice_new(stMainwin);
widgets->main_win = main_win;
widgets->scroll = GTK_WIDGET(gtk_builder_get_object(builder,"scroll"));
GtkCellRenderer *renderer,*renderer1;
widgets->listdel = gtk_list_store_new(4,G_TYPE_STRING,G_TYPE_STRING);
widgets->Box = GTK_WIDGET(gtk_builder_get_object(builder,"Box"));
trMain = GTK_WIDGET(gtk_builder_get_object(builder,"trMain"));
gtk_tree_view_set_model(GTK_TREE_VIEW(trMain),GTK_TREE_MODEL(widgets->listdel));
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("SVNR",renderer,"text",SVNR,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(trMain),GTK_TREE_VIEW_COLUMN(column));
column = gtk_tree_view_column_new_with_attributes("Vorname",GTK_TREE_VIEW_COLUMN(column));
column = gtk_tree_view_column_new_with_attributes("Nachname",GTK_TREE_VIEW_COLUMN(column));
column = gtk_tree_view_column_new_with_attributes("Empfangsdatum",GTK_TREE_VIEW_COLUMN(column));
gtk_list_store_append (GTK_LIST_STORE(widgets->listdel),&iter);
gtk_list_store_set (GTK_LIST_STORE(widgets->listdel),&iter,"1",1,"Name1",2,"Fmname2",3,"heute",-1);
gtk_list_store_append (GTK_LIST_STORE(widgets->listdel),"2","Name2","heute1","3","Name3","Fmname3","heute2",-1);
g_signal_connect(G_OBJECT(main_win),NULL);
gtk_container_add(GTK_CONTAINER(main_win),GTK_WIDGET(widgets->Box));
gtk_builder_connect_signals(builder,widgets);
g_object_unref(widgets->listdel);
}
//funct for create new Box
void on_btPatient_clicked(GtkWidget *widget,stMainwin *widgets){
gtk_list_store_clear(widgets->listdel);
gtk_widget_destroy(widgets->Box);
pat_win(widgets->main_win);
}
其他盒子
void pat_win(GtkWidget *main_win){
GtkBuilder *builder;
GtkWidget *Box;
patient *ptwidgets = g_slice_new(patient);
builder = gtk_builder_new();
gtk_builder_add_from_file (builder,"/home/carlo/Nextcloud/FH/HWSE2/HWSE-Projekt/hwse/win_pat.glade",NULL);
Box = GTK_WIDGET(gtk_builder_get_object(builder,"pat_Box"));
gtk_container_add(GTK_CONTAINER(main_win),GTK_WIDGET(Box));
stMainwin *widgets = g_slice_new(stMainwin);
widgets->main_win = main_win;
widgets->Box = Box;
//gtk_builder_connect_signals(builder,widgets);
gtk_builder_connect_signals(builder,widgets);
ptwidgets->txSvnr = GTK_WIDGET(gtk_builder_get_object(builder,"txSvnr"));
ptwidgets->txName = GTK_WIDGET(gtk_builder_get_object(builder,"txName"));
ptwidgets->txFmname = GTK_WIDGET(gtk_builder_get_object(builder,"txFmname"));
ptwidgets->txGbdatum = GTK_WIDGET(gtk_builder_get_object(builder,"txGbdatum"));
ptwidgets->txGbort = GTK_WIDGET(gtk_builder_get_object(builder,"txGbort"));
ptwidgets->txAdresse = GTK_WIDGET(gtk_builder_get_object(builder,"txAdresse"));
ptwidgets->txPlz = GTK_WIDGET(gtk_builder_get_object(builder,"txPlz"));
ptwidgets->txStadt = GTK_WIDGET(gtk_builder_get_object(builder,"txStadt"));
g_object_unref(builder);
g_signal_connect(G_OBJECT(main_win),NULL);
}
void on_btBack_clicked(GtkWidget *widget,stMainwin *widgets){
gtk_widget_destroy(widgets->Box);
widgets->Box = NULL;
main_Box(widgets->main_win);
}
这些是来自 Glade 的 XML 文件,用于 2 个盒子:
**Main Box XML**
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkBox" id="Box">
<property name="name">Box</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<property name="baseline-position">top</property>
<child>
<object class="GtkScrolledWindow" id="scroll">
<property name="name">scroll</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<property name="propagate-natural-width">True</property>
<property name="propagate-natural-height">True</property>
<child>
<object class="GtkTreeView" id="trMain">
<property name="name">trMain</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="gtkbuttonBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="layout-style">start</property>
<child>
<object class="gtkbutton" id="btPatient">
<property name="label" translatable="yes">Patient</property>
<property name="name">btPatient</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_btPatient_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="gtkbutton" id="btResize">
<property name="label" translatable="yes">resize</property>
<property name="name">btResize</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_btResize_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<object class="GtkListStore" id="liststore1"/>
<object class="GtkListStore" id="liststore2"/>
</interface>
第二个框 XML:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkBox" id="pat_Box">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">70</property>
<property name="margin-top">100</property>
<property name="margin-bottom">30</property>
<property name="orientation">vertical</property>
<child>
<!-- n-columns=4 n-rows=8 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="row-spacing">20</property>
<property name="column-spacing">40</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">baseline</property>
<property name="margin-bottom">50</property>
<property name="label" translatable="yes">SVNR</property>
<property name="justify">right</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txSvnr">
<property name="name">txSvnr</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="margin-bottom">50</property>
<property name="max-length">10</property>
<property name="width-chars">2</property>
<property name="max-width-chars">2</property>
<property name="input-purpose">number</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Vorname</property>
<property name="justify">right</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txName">
<property name="name">txName</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">30</property>
<property name="input-purpose">name</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Geburtsdatum</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txGbdatum">
<property name="name">TxGbdatum</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="input-purpose">digits</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Nachname</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txFmname">
<property name="name">txFmname</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="max-length">30</property>
<property name="input-purpose">name</property>
</object>
<packing>
<property name="left-attach">3</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Geburtsort</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txGbort">
<property name="name">txGbort</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">3</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Adresse</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txAdresse">
<property name="name">txAdresse</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">PLZ</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txPlz">
<property name="name">txPlz</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Stadt</property>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txStadt">
<property name="name">txStadt</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">3</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<!-- n-columns=2 n-rows=1 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">end</property>
<property name="column-spacing">200</property>
<child>
<object class="gtkbuttonBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="orientation">vertical</property>
<property name="layout-style">start</property>
<child>
<object class="gtkbutton" id="btBack">
<property name="label" translatable="yes">Zurück</property>
<property name="name">btBack</property>
<property name="width-request">130</property>
<property name="height-request">45</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<signal name="clicked" handler="on_btBack_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="gtkbuttonBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="spacing">30</property>
<property name="layout-style">end</property>
<child>
<object class="gtkbutton" id="btClear">
<property name="label" translatable="yes">Clear</property>
<property name="name">btClear</property>
<property name="width-request">130</property>
<property name="height-request">45</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="gtkbutton" id="btSuchen">
<property name="label" translatable="yes">Suchen</property>
<property name="name">btSuchen</property>
<property name="width-request">130</property>
<property name="height-request">45</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="gtkbutton" id="btAendern">
<property name="label" translatable="yes">Aendern</property>
<property name="name">btAendern</property>
<property name="width-request">130</property>
<property name="height-request">45</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="gtkbutton" id="btSave">
<property name="label" translatable="yes">Speichern</property>
<property name="name">btSave</property>
<property name="width-request">130</property>
<property name="height-request">45</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="halign">end</property>
<signal name="clicked" handler="on_btSave_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>
过去 2 天我一直在为这个问题而战。我尝试了许多不同的解决方案,但除了 gtk_widget_queue_draw 之外没有任何帮助。在此之后,滚动窗口的大小已正确调整,但几乎大部分时间仍然是错误的。
我现在开始学习编码,这是我第一次在 Stackoverflow 中写问题。我希望我不会发布太多,你能理解我写的内容吗。
预先感谢您的帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)