2 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
感謝 Emmanuel Touzery 的提示,我終于搞定了。我不必使用計(jì)時(shí)器,但問(wèn)題確實(shí)是在填充列表框的那一刻,該行尚未實(shí)現(xiàn),因此不可能發(fā)生坐標(biāo)轉(zhuǎn)換。
我所做的是使用 GLib's 安排滾動(dòng)idle_add(),這使它在下游發(fā)生,這似乎工作得很好:有關(guān)詳細(xì)信息,請(qǐng)參閱此提交。
簡(jiǎn)而言之,這一切都?xì)w結(jié)為以下代碼:
func ListBoxScrollToSelected(listBox *gtk.ListBox) {
// If there's selection
if row := listBox.GetSelectedRow(); row != nil {
// Convert the row's Y coordinate into the list box's coordinate
if _, y, _ := row.TranslateCoordinates(listBox, 0, 0); y >= 0 {
// Scroll the vertical adjustment to center the row in the viewport
if adj := listBox.GetAdjustment(); adj != nil {
_, rowHeight := row.GetPreferredHeight()
adj.SetValue(float64(y) - (adj.GetPageSize()-float64(rowHeight))/2)
}
}
}
}
上面的函數(shù)必須使用glib.IdleAdd()而不是在填充列表框的代碼中調(diào)用。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
所以,我有同樣的問(wèn)題,但設(shè)法讓它在我的情況下工作。我認(rèn)為我的解決方案也很有可能對(duì)您有用。
由于該grab_focus
方法不起作用,我開(kāi)始使用listbox_get_row_at_y
. 非常不滿(mǎn)意,但希望它會(huì)奏效。而且..它沒(méi)有用,因?yàn)?code>get_row_at_y總是返回null
,對(duì)于我提供的所有 y 值。而且我知道列表框不是空的。所以這讓我意識(shí)到我正在嘗試集中我剛剛添加到列表框中的一行。該行還沒(méi)有實(shí)現(xiàn),它無(wú)法集中,因?yàn)樗€沒(méi)有準(zhǔn)備好。
所以我更改了我的代碼來(lái)填充列表框,等待 100 毫秒 timeout,然后才調(diào)用grab_focus
. 那行得通!
我實(shí)際上正在使用一個(gè)為我包裝超時(shí)調(diào)用的庫(kù),但我認(rèn)為您可以為此目的在“原始”gtk 中使用g_timeout_add 。
請(qǐng)注意,這意味著調(diào)用grab_focus
已經(jīng)預(yù)先填充的列表框并且在屏幕上實(shí)現(xiàn)的項(xiàng)目應(yīng)該直接工作。如果這是你的情況,那么這對(duì)你沒(méi)有幫助。
- 2 回答
- 0 關(guān)注
- 256 瀏覽
添加回答
舉報(bào)