- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想传递调用信号的对象作为函数的参数,这样我就可以在该函数中操作该对象。该对象是 QLineEdit 小部件。这是示例:
self.fieldList = []
for i in range(10):
self.valueField = QtGui.QLineEdit()
self.fieldList.append(self.valueField)
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
def checkState(self, line, palette1, palette2):
if len(line.text()) > 3:
line.setPalette(palette1)
else:
line.setPalette(palette2)
因此,如您所见,我尝试将列表元素 self.fieldList[i] 作为名称为 line 的参数传递到 checkState( ) 函数。如果我在 checkState() 函数中显式定义 fieldList 元素(即 self.fieldList[0]),则代码可以完美运行,但我无法将其作为参数传递。我做错了什么?
顺便说一句。当我尝试运行该程序时,编译器没有给我错误消息,但它根本无法完成它应该做的工作(当我写入超过 3 个字符时更改 QLineEdit 的颜色)
编辑:
@dex19dt
是的,这是一个例子,但你是对的!只有最后一个 QLineEdit 才能正常工作!
问题是,我无法给出所有这些小部件的名称,因为它们的数量取决于所选的图层,这意味着有时有 5 个小部件,有时甚至有 11 个或 75 个。
我可以轻松地命名这些小部件并设置文本,如下所示:
self.fieldList[i].setObjectName(_fromUtf8("attributeValueField_{0}".format(i)))
self.fieldList[i].setText(_fromUtf8("{0}".format(value.toString())))
这对于每个小部件都适用,但我不知道如何定义信号?你有什么想法吗?
<小时/>编辑:
@dex19dt
好的,所以我问了索引不“粘在”函数调用上的问题,我发现这就是Python的工作方式,为了解决这个问题,我需要替换这一行:
self.fieldList[i].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList[i], palette1, palette2)))
这个:
self.fieldList[i].cursorPositionChanged.connect(lambda old, new, i=i: (self.checkState(self.fieldList[i], palette1, palette2)))
这样当前索引就会复制到信号索引。虽然我不太确定为什么会有旧的,新的
部分。它是引用 lambda 函数还是简单地将左 i
定义为旧变量,将右 i
定义为新变量...尝试用谷歌搜索它,但没有成功。
最佳答案
好吧,我假设您问题中的代码是一个示例,而不是您的真实代码。因为,由于您在没有附加参数的循环中创建小部件,因此结果将是窗口中所有对象的重叠。您会看到,所有行编辑都将位于同一位置(默认情况下,位于窗口的左上角)。如果是这样的话,真的很难判断问题出在哪里,因为在我看来,这只是知道 lineEdit 的哪个实例正在发送信号的问题。
所以我会告诉你如何使上面的代码工作,如果不是这样,你可以随时回复。
这一切都与信号的连接方式有关。如果您查看代码,就会发现您正在创建具有相同名称(self.valueField)的所有行编辑。这些对象都已创建,并且它们在内存中拥有自己的位置,但它们在连接中的引用始终会被最后一个连接覆盖。您甚至可以进行测试。如果将此行添加到 checkState 函数中:
打印 self.fieldList.index(line)
您将看到始终为列表的最后一项调用信号,这也是最后连接的信号。
您可以简单地用不同的名称一一设置所有行编辑。创建您的列表并在其中输入所有名称。这样你的 for 循环将只连接 lineEdits 而不再创建它们。
编辑:
好的。完成这项工作的一种方法是使用 SignalMapper。看看docs here .
在上面的示例中,您可以执行以下操作:
首先声明映射器,与声明其他小部件的方式相同:
self.myMapper = QtCore.QSignalMapper()
在第一个 for 循环之后。您迭代列表:
for item in self.fieldList:
self.myMapper.setMapping(item, self.fieldList.index(item))
item.textEdited.connect(self.myMapper.map)
self.myMapper.mapped[int].connect(checkState)
因此,它会将列表中的每个对象映射到列表中相应的索引 (int)。因此,当发出信号时,映射器会使用该索引值作为参数来调用 checkState 函数。这样您就可以再次使用列表到达您的对象:
def checkState(i):
print (self.fieldList[i].objectName())
self.fieldList[i].setText("It works!")
如您所见,映射器将仅发送索引作为参数。因此,我想您需要使用附加参数 palette1、palette2
来调整您的函数。或者您可以使用像过滤器这样的预备函数,然后在其中调用正确的 checkState 函数:
def myfilter(i):
checkState(self.fieldList[i], palette1, palette2)
我很确定存在其他方法来完成这项工作,但是这个方法可以完成这项工作,但没有出现更好的解决方案。
关于python - 在 PyQt 中将列表元素作为信号/槽参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11117052/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!