首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQT中的简单分层列表

PyQT中的简单分层列表
EN

Stack Overflow用户
提问于 2011-09-25 14:18:42
回答 2查看 1.1K关注 0票数 1

我正在尝试创建一个有3列的UI -当你在左列选择一个项目时,选择的项目被传递给一个函数,它返回中间列的项目(当然,选择中间列的项目也是如此)

应该很简单,但是我找不到任何简单的方法来做到这一点。

我首先尝试了QColumnView,因为它看起来很完美。然而,实现QAbstractItemModel似乎过于复杂,我找不到任何有用的示例。

接下来,由于有固定数量的级别,我创建了三个QListView,并修改了this example QAbstractListModel

..however似乎没有有用的信号可以用来触发层次结构的其他级别的更新。根据PyQT文档,QListView只有"indexesMoved“信号。也有“点击”和“按下”,但这些不会触发时,用键盘更改项目

最后一个选项是QListWidget,它可以工作,因为它有所需的信号(itemChanged等),但是创建列表项的方式有点单调乏味(将父元素设置为QListWidget实例的QListWidgetItem )

编辑:QListWidget几乎满足了我的需求:

代码语言:javascript
复制
self.first_column = QListWidget()
self.first_column.itemSelectionChanged.connect(self.update_second_column)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 00:08:16

任何QAbastractItemView都有一个可通过selectionModel方法访问的QItemSelectionModel。QItemSelectionModel提供的信号可能会帮助您:

代码语言:javascript
复制
currentChanged ( const QModelIndex & current, const QModelIndex & previous )
currentColumnChanged ( const QModelIndex & current, const QModelIndex & previous )
currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )
selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected )

希望能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-09-25 16:30:48

QListView继承自QAbstractItemView (我想你知道这一点),所以它得到了a few signals,希望其中的一个(或几个)能为你工作。

这对我很有效(在初始化QMainWindow或主QWidget时连接信号,如SaltyCrane示例中所示):

代码语言:javascript
复制
connect(your_list_view, SIGNAL("clicked(const QModelIndex&)"), handler_slot)

..。

代码语言:javascript
复制
def handler_slot(idx):
    #idx is a QModelIndex
    #QModelIndex.data() returns a QVariant, Qt4's generic data container
    celldata = idx.data()
    #Choose the proper datatype to ask the QVariant for (e.g. QVariant.toInt())
    actualvalue = celldata.toInt()
    #QVariant.toInt() happens to return a tuple
    print actualvalue[0]

根据模型中的数据类型,您可能希望使用choose the right data type to ask QVariant for

这里偷偷摸摸的部分是让QListView告诉你哪个单元格被点击了(例如,使用clicked(const QModelIndex&)clicked())。我想我花了一些时间阅读Qt4的C++文档,然后才意识到您可以从信号中获得更多信息。

从这里开始,我将让handler_slot()在模型上为您的第二个QListView调用setData()方法(使用您最初计划使用的函数生成的数据)。

如果我还没有完全回答你的问题,我很乐意详细说明。

编辑:使用箭头键

嗯,这看起来很奇怪,箭头移动没有默认的QListView信号,但我们可以创建自己的。

(对于Qt4的信号和插槽操作方式来说,这似乎已经过时了)

QListView重新实现了keyPressEvent(self, QKeyEvent)方法,该方法在某些键被按下时充当回调函数。You can read more。我们可以使用它来获取我们想要的按键事件,并发出我们自己的信号。

代码语言:javascript
复制
class ArrowableListView(QListView):
    def keyPressEvent(self, keyevent):
        #Maintain original functionality by calling QListView's version
        QListView.keyPressEvent(self, keyevent)

        #QListView.selectedIndexes returns a list of selected cells, I'm just taking the first one here
        idx = self.selectedIndexes()[0]

        #We'll emit a signal that you can connect to your custom handler
        self.emit(SIGNAL("my_signal"), idx)

一旦发生按键,我们就会询问QListView所选的索引(!)是。当然,您可以选择filter out certain keys并选择是否处理多个选中的单元格(我认为您可以设置一种不可能的选择模式,请参阅QListView文档)。

现在我们有了选定的索引(QModelIndex列表),我们将第一个索引( QModelIndex)与我们的信号一起传递。因为我们是用python定义这个信号,所以我们不需要设置函数原型;我不知道这是不是很糟糕的风格。

现在,您要做的就是将信号连接到一个处理程序:

代码语言:javascript
复制
self.connect(your_list_view, SIGNAL("my_signal"), handler_slot)

并编写你的处理程序。

我希望这不是一个太糟糕的变通方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7543961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档