0

我正在将一个 GUI 从 gWidgets 移植到 RGtk2。gui 的一部分是应该用于分析的文件列表。我希望能够从此列表中选择文件并按下一个按钮来删除选定的文件。我可以使用以下代码创建它的剥离版本。

当 setMode 设置为“多个”时,当我运行 getSelectedRows 时,我会获得所选行的路径列表。我被困在如何将其转换为从 TreeModel 中删除这些行的方式。据我了解,不能直接删除 TreeModel 中的行或列,所以我必须提取数据,删除选定的行,然后用新数据更新 rGtkDataFrame?

任何帮助表示赞赏...

最佳/托马斯

filelist <- rGtkDataFrame(data.frame(Datafiles=character(), stringsAsFactors=FALSE))
mainWindow <- gtkWindow(show=FALSE)
datafileSelect <- gtkHBox(FALSE, 5)
mainWindow$add(datafileSelect)
files <- gtkTreeView(filelist)
files$insertColumnWithAttributes(position=-1, title='MS datafiles', cell=gtkCellRendererText(), text=0)
files$setHeadersVisible(FALSE)
fileSelect <- files$getSelection()
fileSelect$setMode('multiple')
datafileSelect$packStart(files)
datafileSelectButtons <- gtkVBox(FALSE, 5)
datafileSelect$packStart(datafileSelectButtons, expand=FALSE, fill=FALSE)
fileAddButton <- gtkButton(label='Add')
gSignalConnect(fileAddButton, 'clicked', f=function(widget, ...){
    file <- gtkFileChooserDialog(title='Select MS datafiles', parent=mainWindow, action='open', 'gtk-ok', GtkResponseType['ok'], 'gtk-cancel', GtkResponseType['cancel'], show=FALSE)
    file['select-multiple'] <- TRUE
    gSignalConnect(file, 'response', f=function(dialog, response, data){
        if(response == GtkResponseType['ok']){
          files <- as.character(dialog$getFilenames())
          filelist$appendRows(data.frame(Datafiles=files, stringsAsFactors=FALSE))
          setwd(dirname(files[1]))
        }
        dialog$destroy()
        })
    file$show()
    })
fileRemoveButton <- gtkButton(label='Remove')
gSignalConnect(fileRemoveButton, 'clicked', f=function(widget, ...){
    selected <- fileSelect$getSelectedRows()
    })
datafileSelectButtons$packStart(fileAddButton, expand=FALSE, fill=FALSE)
datafileSelectButtons$packStart(fileRemoveButton, expand=FALSE, fill=FALSE)
mainWindow$setDefaultSize(250, 300)
mainWindow$show()
4

1 回答 1

0

没关系-我想通了...

gtkTreePathToString 函数返回选择的索引,比更新 rGtkDataFrame 中的 TreeModel 更容易。因此,删除按钮的 gSignalConnect 是:

gSignalConnect(fileRemoveButton, 'clicked', f=function(widget, ...){
    selected <- sapply(fileSelect$getSelectedRows()$retval, function(x) as.numeric(x$toString())+1)
    filelist$setFrame(filelist[-selected, , drop=FALSE])
    })
于 2013-02-07T12:45:27.870 回答