GTK4中如何让GtkColumnView显示两行以上的可见行?
GtkColumnView 仅显示两行问题
从现有示例来看,GtkColumnView需要嵌套在GtkScrolledWindow中来设置可见区域。我已将GtkScrolledWindow的高度设为可容纳约10行,但运行后始终只显示两行。鼠标在区域内移动时,带计数的标签显示程序正在创建新行,但视觉上最多仅显示两行。我尝试为多个组件设置VExpand属性,无任何变化。
我从UI文件加载GtkColumnView,通过代码创建两列,并编写少量代码在模型请求时向列表添加条目。按预期,程序应持续添加行直到填满可视空间,而该空间本应可容纳约10行。
以下是精简后的代码与UI文件(仅保留必要内容),以及最终效果截图。注意截图中的数字49和50:初始显示1和2,当鼠标在两行上下移动时,程序开始创建新行。我未编写删除行的代码,无法理解为何GtkColumnView在有足够扩展空间的情况下,始终只显示两行。
代码中setup()函数之前的内容可忽略,仅作完整性展示,相关逻辑从setup()函数开始。
Go 代码
package scratches import ( `strconv` `time` `github.com/diamondburned/gotk4/pkg/gtk/v4` `gitlab.com/trading5124936/tradinganalyzer.git/analyzer/dbLayer` `gitlab.com/trading5124936/tradinganalyzer.git/analyzer/gui/fields/checkButton` `gitlab.com/trading5124936/tradinganalyzer.git/analyzer/gui/fields/timezone` `gitlab.com/trading5124936/tradinganalyzer.git/analyzer/gui/interfaces` ) type fields struct { apply *checkButton.CheckButton timezone *timezone.Timezone } type GtkColumnViewDaysAndTimes struct { c *interfaces.IConfig id string enum int fieldIDs map[int]string cv *gtk.ColumnView prototypeFields map[string]fields rows []*map[string]fields *dbLayer.GUI saveTimer *time.Timer settingValue bool } func New(id string, enum int, config interfaces.IConfig) (dat *GtkColumnViewDaysAndTimes) { cv := config.GetBuilder().GetObject(id).Cast().(*gtk.ColumnView) applyID := id + `.Field.Apply` timezoneID := id + `.Field.Timezone` fieldIDs := map[int]string{ 0: applyID, 1: timezoneID, } prototypeFields := map[string]fields{ fieldIDs[0]: {apply: checkButton.New(fieldIDs[0], 0, config, false)}, fieldIDs[1]: {timezone: timezone.New(fieldIDs[1], 0, config, false)}, } dat = &GtkColumnViewDaysAndTimes{ &config, id, enum, fieldIDs, cv, prototypeFields, []*map[string]fields{0: &prototypeFields}, config.GetDBLayer(), nil, false, } dat.setup() return } func (dat *GtkColumnViewDaysAndTimes) setup() { applySignals := gtk.NewSignalListItemFactory() applySignals.ConnectSetup(dat.setupApply) applySignals.ConnectBind(dat.bindApply) colApply := gtk.NewColumnViewColumn(`Apply`, &applySignals.ListItemFactory) colApply.SetExpand(true) colApply.SetResizable(true) tzSignals := gtk.NewSignalListItemFactory() tzSignals.ConnectSetup(dat.setupTZ) tzSignals.ConnectBind(dat.bindTZ) colTZ := gtk.NewColumnViewColumn(`Timezone`, &tzSignals.ListItemFactory) colTZ.SetExpand(true) colTZ.SetResizable(true) dat.cv.AppendColumn(colApply) dat.cv.AppendColumn(colTZ) dat.cv.SetHExpand(true) dat.cv.SetVExpand(true) dat.cv.SetHExpand(true) lm := dat.cv.Columns() sm := gtk.NewSingleSelection(lm) dat.cv.SetModel(sm) } func (dat *GtkColumnViewDaysAndTimes) setupApply(listItem *gtk.ListItem) { child := gtk.NewCheckButton() child.SetVExpand(true) child.SetHExpand(true) child.SetHAlign(0) listItem.SetChild(child) } func (dat *GtkColumnViewDaysAndTimes) setupTZ(listItem *gtk.ListItem) { child := gtk.NewEntry() child.SetVExpand(true) child.SetHExpand(true) child.SetHAlign(0) listItem.SetChild(child) } var count = 1 func (dat *GtkColumnViewDaysAndTimes) bindApply(listItem *gtk.ListItem) { child := listItem.Child().(*gtk.CheckButton) child.SetLabel(`Count ` + strconv.Itoa(count)) } func (dat *GtkColumnViewDaysAndTimes) bindTZ(listItem *gtk.ListItem) { child := listItem.Child().(*gtk.Entry) child.SetText(`Also ` + strconv.Itoa(count)) count++ }
UI 文件(XML)
<?xml version='1.0' encoding='UTF-8'?> <!-- Created with Cambalache 0.16.0 --> <interface> <!-- interface-name TradingAnalyzer.ui --> <!-- interface-authors Reg Proctor --> <requires lib="gio" version="2.0"/> <requires lib="gtk" version="4.6"/> <object class="GtkApplicationWindow" id="AppWin"> <property name="default-height">960</property> <property name="default-width">1200</property> <property name="title">Trading Analyzer Settings</property> <child> <object class="GtkBox" id="main_box"> <property name="orientation">GTK_ORIENTATION_VERTICAL</property> <child> <object class="GtkPopoverMenuBar"> <property name="halign">start</property> <property name="margin-bottom">10</property> <property name="menu-model">menu</property> <property name="name">General Menu</property> <property name="valign">start</property> </object> </child> <child> <object class="GtkPaned"> <child> <object class="GtkFrame"> <property name="label">Settings</property> <child> <object class="GtkStackSidebar"> <property name="halign">start</property> <property name="height-request">900</property> <property name="stack">Pages</property> <property name="valign">start</property> </object> </child> </object> </child> <child> <object class="GtkFrame"> <child> <object class="GtkStack" id="Pages"> <property name="name">Timezone</property> <child> <object class="GtkStackPage" id="GeneralSetup"> <property name="child"> <object class="GtkFlowBox"> <property name="margin-bottom">20</property> <property name="margin-end">50</property> <property name="margin-start">50</property> <property name="margin-top">20</property> <property name="name">Timezone</property> <child> <object class="GtkEntry" id="GeneralSetup.Timezone"> <property name="activates-default">True</property> <property name="focusable">True</property> <property name="halign">start</property> <property name="height-request">10</property> <property name="input-purpose">alpha</property> <property name="placeholder-text">Timezone</property> <property name="text">America/Phoenix</property> <property name="tooltip-text">Enter your timezone</property> <property name="valign">center</property> <property name="width-request">50</property> </object> </child> </object> </property> <property name="name">General Setup</property> <property name="title">General Setup</property> </object> </child> <child> <object class="GtkStackPage" id="Show"> <property name="child"> <object class="GtkLabel"> <property name="label">Empty Page</property> </object> </property> <property name="title">Show</property> </object> </child> <child> <object class="GtkStackPage" id="BackTesting"> <property name="child"> <object class="GtkLabel"> <property name="label">Empty Page</property> </object> </property> <property name="title">Back Testing</property> </object> </child> <child> <object class="GtkStackPage" id="BackTesting.Dates"> <property name="child"> <object class="GtkFlowBox"> <property name="hexpand">True</property> <property name="max-children-per-line">1</property> <property name="min-children-per-line">1</property> <property name="valign">start</property> <property name="vexpand">True</property> <child> <object class="GtkScrolledWindow"> <property name="hexpand">True</property> <property name="kinetic-scrolling">False</property> <property name="max-content-height">300</property> <property name="min-content-height">300</property> <property name="min-content-width">400</property> <property name="vexpand">True</property> <property name="vscrollbar-policy">always</property> <child> <object class="GtkColumnView" id="BackTesting.Dates.DaysAndTimes"> <property name="halign">start</property> <property name="height-request">300</property> <property name="hexpand">True</property> <property name="single-click-activate">True</property> <property name="vadjustment"> <object class="GtkAdjustment"> <property name="lower">200.0</property> <property name="step-increment">10.0</property> <property name="upper">400.0</property> <property name="value">300.0</property> </object> </property> <property name="vexpand">True</property> <property name="width-request">300</property> </object> </child> </object> </child> </object> </property> <property name="name">BackTesting.Dates</property> <property name="title"> Dates</property> </object> </child> </object> </child> </object> </child> </object> </child> </object> </child> </object> <menu id="menu"> <submenu> </submenu> </menu> </interface>
显示效果截图

内容的提问来源于stack exchange,提问作者Reg
相关产品推荐
相关产品推荐

