【问题标题】:Overloaded pyside signals (QComboBox)重载的 pyside 信号 (QComboBox)
【发布时间】:2012-08-07 18:46:04
【问题描述】:

使用 QComboBox 和 pyside,我知道如何连接信号并使用它发送的索引。但是 unicode 参数呢?如果我更喜欢连接到需要组合框中的字符串的东西,这可能吗?

来自: http://www.pyside.org/docs/pyside/PySide/QtGui/QComboBox.html#PySide.QtGui.QComboBox

所有三个信号都存在于两个版本中,一个带有 PySide.QtCore.QString 参数,一个带有 int 参数。

信号

def activated (arg__1)
def activated (index)

PySide.QtGui.QComboBox.activated(index) 参数:index – PySide.QtCore.int

PySide.QtGui.QComboBox.activated(arg_1) 参数:arg_1 – unicode

编辑:一些代码。

le = ComboBoxIpPrefix()
le.currentIndexChanged.connect(lambda x....)

这段代码给了我索引。问题是如何获取文档中提到的 unicode 字符串。

【问题讨论】:

    标签: signals overloading pyside qcombobox


    【解决方案1】:

    谢谢Oleh Prypin!当我在 PySide 文档中遇到晦涩的 arg__1 时,您的回答对我有所帮助。

    当我同时测试 combo.currentIndexChanged[str] 和 combo.currentIndexChanged[unicode] 时,每个信号都发送当前索引文本的 unicode 版本。

    这是一个演示该行为的示例:

    from PySide import QtCore
    from PySide import QtGui
    
    class myDialog(QtGui.QWidget):
        def __init__(self, *args, **kwargs):
            super(myDialog, self).__init__(*args, **kwargs)
    
            combo = QtGui.QComboBox()
            combo.addItem('Dog', 'Dog')
            combo.addItem('Cat', 'Cat')
    
            layout = QtGui.QVBoxLayout()
            layout.addWidget(combo)
    
            self.setLayout(layout)
    
            combo.currentIndexChanged[int].connect(self.intChanged)
            combo.currentIndexChanged[str].connect(self.strChanged)
            combo.currentIndexChanged[unicode].connect(self.unicodeChanged)
    
            combo.setCurrentIndex(1)
    
        def intChanged(self, index):
            print "Combo Index: "
            print index
            print type(index)
    
        def strChanged(self, value):
            print "Combo String:"
            print type(value)
            print value
    
        def unicodeChanged(self, value):
            print "Combo Unicode String:"
            print type(value)
            print value
    
    if __name__ == "__main__":
    
        app = QtGui.QApplication([])
        dialog = myDialog()
        dialog.show()
        app.exec_()
    

    结果输出是:

    Combo Index
    1
    <type 'int'>
    Combo String
    <type 'unicode'>
    Cat
    Combo Unicode String
    <type 'unicode'>
    Cat
    

    我还确认 basestring 会抛出错误IndexError: Signature currentIndexChanged(PyObject) not found for signal: currentIndexChanged。 PySide 似乎区分了intfloat(它称为double)、str/unicode(两者都变为unicode)和bool,但所有其他python 类型都被解析作为PyObject 用于信号签名。

    希望对某人有所帮助!

    【讨论】:

      【解决方案2】:

      我不明白你的问题到底是什么。

      QComboBox.activated 信号有两个版本。 One 为您提供所选项目的索引,other one 为您提供其文本。

      要在 PySide 中选择它们,请执行以下操作:

      a_combo_box.activated[int].connect(some_callable)
      
      a_combo_box.activated[str].connect(other_callable)
      

      第二行在 Python 2 中可能不会以这种方式工作,因此将 str 替换为 unicode

      请注意,我使用通用 (C++) Qt 文档,因为 PySide 文档仍然很模糊:我到处都看到那些 arg__1s...
      “翻译”到 Python 应该不会太难。请记住,QString 变为 str(或 Python 2 中的 unicode;顺便说一句,我喜欢让我的代码适用于所有版本的 Python,所以我通常创建一个别名类型 text 即 @ Py3 中的 987654332@ 和 Py2 中的 unicode); longshort等变成intdouble 变为 floatQVariant 是完全避免的,它只是意味着任何数据类型都可以在那里传递;等等……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 2012-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-03
        • 2011-10-21
        相关资源
        最近更新 更多