相关疑难解决方法(0)

在循环中创建函数

我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)
Run Code Online (Sandbox Code Playgroud)

这输出:

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

python function

79
推荐指数
2
解决办法
3万
查看次数

QTabWidget:关闭标签按钮不起作用

我已设置ui->tabWidget->setTabsClosable(true);QTabwidget只在每个选项卡上显示一个十字架,而不是在单击此按钮时关闭选项卡.还有什么办法可以让标签关闭?我试图连接任何接近信号的插槽(这对于这项工作是合适的)tabCloseRequested(int)但在tabwidget中找不到任何这样的插槽.请建议正确的方法.

qt qt4 qt4.8 qtabwidget

11
推荐指数
3
解决办法
1万
查看次数

pyqt:在pyqt中将多个信号连接到同一个函数的正确方法(QSignalMapper不适用)

  1. 我已经准备了很多关于如何在 python 和 pyqt 中将多个信号连接到同一个事件处理程序的帖子。例如,将多个按钮或组合框连接到同一功能。

  2. 许多示例展示了如何使用 QSignalMapper 执行此操作,但是当信号携带参数时不适用,例如 combobox.currentIndexChanged

  3. 许多人建议它可以用 lambda 来制作。这是一个干净漂亮的解决方案,我同意,但没有人提到 lambda 创建了一个闭包,其中包含一个引用 - 因此无法删除被引用的对象。你好内存泄漏!

证明:

from PyQt4 import QtGui, QtCore

class Widget(QtGui.QWidget):
    def __init__(self):
        super(Widget, self).__init__()

        # create and set the layout
        lay_main = QtGui.QHBoxLayout()
        self.setLayout(lay_main)

        # create two comboboxes and connect them to a single handler with lambda

        combobox = QtGui.QComboBox()
        combobox.addItems('Nol Adyn Dwa Tri'.split())
        combobox.currentIndexChanged.connect(lambda ind: self.on_selected('1', ind))
        lay_main.addWidget(combobox)

        combobox = QtGui.QComboBox()
        combobox.addItems('Nol Adyn Dwa Tri'.split())
        combobox.currentIndexChanged.connect(lambda ind: self.on_selected('2', ind))
        lay_main.addWidget(combobox)

    # let the handler show …
Run Code Online (Sandbox Code Playgroud)

python garbage-collection pyqt signals-slots qsignalmapper

4
推荐指数
1
解决办法
3225
查看次数

Qt - 使用 lambda 将插槽与参数连接

我有几个小部件将连接到需要额外参数的单个函数。

我发现我可以使用 lambda 函数来向函数传递一些参数。

问题是参数在循环中被替换,而 lambda 函数只传递最后一组。

这是我得到的:

self.widgets是一个带有按钮组键的字典,为了简短起见,假设它有 2 个按钮 [QToolButton],链接到它们的键:“播放”和“停止”。

def connections(self):
    for group in self.widgets:
        self.widgets[group].clicked.connect(lambda: self.openMenu(group))

    def openMenu(self,group):
        print group
Run Code Online (Sandbox Code Playgroud)

但是无论我点击哪个按钮,它都会打印同一个组,即在 for 循环中迭代的最后一个组。

有任何解决这个问题的方法吗?

python lambda qt pyqt signals-slots

2
推荐指数
1
解决办法
3444
查看次数

pyQt按钮在循环内连接创建

我是 pyqt 的新手(Maya 中的 pyside),请对我好一点:)

所以关键是我想通过循环语句生成许多按钮,类似于下面的东西:

(窗口中的 5 个按钮 - 完整代码 - 玛雅)

import PySide.QtCore as qc
import PySide.QtGui as qg
class simpleUI(qg.QDialog):
    def __init__(self):
        qg.QDialog.__init__(self)
        self.setWindowTitle('Simple UI')
        self.btn=[]
        for x in range(5) :
           self.btn.append(x)
           self.btn[x]= qg.QPushButton(self)
           self.btn[x].setText('this is btn number{0}'.format(x))
           self.btn[x].setGeometry(qc.QRect(0,100+(x*20), 100,20))
           self.btn[x].clicked.connect(lambda : self.notifyMe(x))
    def notifyMe(self,index):
        print index
dialog = simpleUI()
dialog.show()
Run Code Online (Sandbox Code Playgroud)

如您所见,我将按钮对象存储在数组中,但问题是当我想将 btn 信号与notifyMe 函数连接时,每个按钮总是给出 x 相同的值 (x=4),同时在button.setText x 成功给出唯一的增量值,我不明白为什么..

python qt pyqt maya

0
推荐指数
1
解决办法
2798
查看次数