Как сделать простой ComboBoxEntry в gtk2hs? - PullRequest
0 голосов
/ 26 февраля 2011

Я использую приведенный ниже код, адаптированный из учебника.В раскрывающемся списке отображаются две опции, но когда я выбираю одну, выдается ошибка на консоли:

(комбинированный: 12158): Gtk-CRITICAL **: IA__gtk_entry_set_text: assertion `text! = NULL'не удалось

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  store <- listStoreNew ["one", "two"]
  combo <- comboBoxEntryNewWithModel store
  ren <- cellRendererTextNew
  cellLayoutPackEnd combo ren False
  cellLayoutSetAttributes combo ren store
    (\txt -> [cellText := txt])
  containerAdd window combo

  widgetShowAll window
  mainGUI

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Вы пытаетесь добавить средство рендеринга и установить его атрибуты, что все в порядке. Но вы не указываете ComboBoxEntry, где находится текст, который должен быть в конечном итоге отредактирован. Разработчики Gtk + не предусматривают извлечение этого текста с помощью функций обратного вызова, что делает Gtk2Hs (и вы в вашем примере). Вместо обратных вызовов Gtk + использует номер столбца для ссылки на конкретную точку в строке данных. Большинство специальных функций в моделях используют номера столбцов, поскольку с ними гораздо проще работать в C, чем с функциями обратного вызова. В Gtk2Hs вы можете добавить номера столбцов поверх любого другого атрибутного сопоставления. Я изменил ваш пример, чтобы объявить константу ColumnId (которая может использовать любое целое число, которое вы еще не использовали для модели). Gtk2Hs всегда использует функции обратного вызова, поэтому мы должны связать функцию извлечения id с этим номером столбца. Третья модификация - указать ComboBoxEntry использовать этот номер столбца в качестве источника текста. Я сохранил часть вашего кода, вставляющую средство визуализации текста, но установил его атрибут на константу. Таким образом, текст из вашего магазина и константа «<- ваш выбор» будут отображаться в каждой строке. </p>

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC

textColumn :: ColumnId String String
textColumn = makeColumnIdString 0

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  store <- listStoreNew ["one", "two"]
  customStoreSetColumn store textColumn id -- set the extraction function
  combo <- comboBoxEntryNewWithModel store
  comboBoxEntrySetTextColumn combo textColumn -- set which column should be used
  ren <- cellRendererTextNew
  cellLayoutPackEnd combo ren False
  cellLayoutSetAttributes combo ren store
    (\txt -> [cellText := "<-- your choice"])
  containerAdd window combo

  widgetShowAll window
  mainGUI
1 голос
/ 27 февраля 2011

Когда вы используете ComboBoxEntry, вам нужно явно указать текстовый столбец. Теоретически вы должны быть в состоянии звонить comboBoxEntrySetTextColumn, однако я не мог сделать эту работу. Хотя я смог сделать следующее:

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC
import Control.Monad

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetDefaultSize window 800 600
  windowSetPosition window WinPosCenter

  combo <- comboBoxEntryNewText
  store <- comboBoxEntrySetModelText combo
  mapM_ (listStoreAppend store) ["one", "two"]

  containerAdd window combo
  widgetShowAll window
  mainGUI

Разница в том, что когда ComboBoxEntry создается из comboBoxEntryNewText, он уже настроен на использование ListStore String с соответствующим текстовым столбцом. У него также есть средство рендеринга, так что вам также не нужно его устанавливать. Один большой недостаток заключается в том, что он также устанавливает хранилище моделей, поэтому, если вы намеревались использовать хранилище, совместно используемое с другим виджетом, вам необходимо создать его здесь.

Я подозреваю, что comboBoxEntrySetModelText имеет неправильное имя, похоже, это должно быть "getModelText".

...