You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:15:56