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

Gtk.TreeViewColumn无法同时右对齐表头与列表内容的问题

Gtk TreeView表头对齐失效问题

我用以下代码在网格中展示数据库表:

cols = [
    { "column": 0, "dbcolumn": "id", "dbtype": int, "title": "ID", "renderer": "text", "alignment": 0.0 },
    { "column": 1, "dbcolumn": "pocket_name", "dbtype": str, "title": "POCKET", "renderer": "text", "alignment": 0.0 },
    { "column": 2, "dbcolumn": "sort_code", "dbtype": str, "title": "SORT", "renderer": "text", "alignment": 0.0 },
    { "column": 3, "dbcolumn": "account_code", "dbtype": str, "title": "ACCOUNT", "renderer": "text", "alignment": 0.0 },
    { "column": 4, "dbcolumn": "PRINTF('%.2f', balance)", "dbtype": str, "title": "BALANCE", "renderer": "text", "alignment": 1.0 },
    { "column": 5, "dbcolumn": "STRFTIME('%d/%m/%Y', expires)", "dbtype": str, "title": "EXPIRES", "renderer": "text", "alignment": 0.0 }
]

sql = "SELECT " + ", ".join(v["dbcolumn"] for v in cols) + " FROM pockets ORDER BY sort_order, pocket_name"
store = Gtk.ListStore(*[k["dbtype"] for k in cols])

c = db.conn.cursor()
rc = c.execute(sql)

for r in rc:
    store.append(r)

data_list = Gtk.TreeView.new();

for c in cols:

    renderer = Gtk.CellRendererText()   # text only
    renderer.set_alignment(c["alignment"], 1.0)

    column = Gtk.TreeViewColumn(c["title"], renderer, text=c["column"])
    column.set_sort_column_id(c["column"])
    column.set_resizable(True)
    column.set_alignment(c["alignment"]) # not working

    data_list.append_column(column)

# Set the tree view model
data_list.set_model(store)

target.append(data_list)

单独调用renderer.set_alignment(c["alignment"], 1.0)与column.set_alignment(c["alignment"])时均能正常生效,但同时使用这两行代码时,仅列表内容的对齐效果正常,表头未按设置对齐。请问我遗漏了什么配置?


解决方案

问题出在column.set_alignment()的作用范围:它控制的是列表单元格内容区域的整体对齐,而非表头标题的对齐。要让表头按配置对齐,你需要调用column.set_title_alignment()方法单独设置表头的对齐方式。

修改后的循环代码片段:

for c in cols:
    renderer = Gtk.CellRendererText()   # text only
    renderer.set_alignment(c["alignment"], 1.0)

    column = Gtk.TreeViewColumn(c["title"], renderer, text=c["column"])
    column.set_sort_column_id(c["column"])
    column.set_resizable(True)
    # 设置表头标题的对齐
    column.set_title_alignment(c["alignment"])
    # 若需控制列内容区域的整体位置对齐,可保留此配置(可选)
    # column.set_alignment(c["alignment"])

    data_list.append_column(column)

关键区别说明

  • renderer.set_alignment():控制单元格内文本的对齐方式
  • column.set_title_alignment():控制表头标题文本的对齐方式
  • column.set_alignment():控制整个列在TreeView中的位置对齐(比如列整体靠左/右,与单元格内容对齐是不同概念)

调整后,内容和表头就能同时按配置的对齐方式显示。


内容的提问来源于stack exchange,提问作者garybarnes59

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:30:19