如何在PyQt5中获取变量值,外部事件过滤器方法?

库玛

Hai,我想打印在“ eventFilter”方法中声明的变量值?在我的代码中,如果focusitem为textbox1,则fitem =“ textbox 1”,如果焦点更改为textbox 2,则fitem为“ textbox2”,依此类推。现在,我想在方法之外打印fitem。(例如,在我的代码第42至44行中,尝试了一些操作,但是什么也不会发生)

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

item1 = ["Python", "Python 2.7", "Python 2.9", "Python 3.5", "Python 3.7", "National", "Zebra",
        "Apple", "X Ray", "Boat", "Tiger", "Item001", "Item002", "Item003", "Item004", "Item005",
        "001Item", "002Item", "003Item", "004Item", "005Item", "Ball", "Cat", "Dog", "Fish",
        "Gold Fish", "Star Fish", "2821", "2822", "2823", "2811", "2812", "2813"]

item2 = ["India", "America", "Russia", "China", "England", "Iran", "Iraq", "Ice Land"]

item3 = ["Apple","Orange","Bannana","Grapes","Jack Fruit","Black","White","Green","Blue",
         "DarkBlue", "Light Blue","Red","Dark Red","Red Medium","Reddish Blue"]

fitem = None

class Check(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Check Window")
        self.textbox1 = QLineEdit(self)
        self.textbox1.setGeometry(100, 100, 300, 30)
        self.textbox2 = QLineEdit(self)
        self.textbox2.setGeometry(100, 150, 300, 30)
        self.textbox3 = QLineEdit(self)
        self.textbox3.setGeometry(100, 200, 300, 30)

        self.lbox1 = QListWidget()
        self.lbox2 = QListWidget(self)
        self.lbox2.setGeometry(100, 250, 300, 500)
        self.textbox1.setObjectName("textbox1")
        self.textbox2.setObjectName("textbox2")
        self.textbox3.setObjectName("textbox3")

        self.textbox1.installEventFilter(self)
        self.textbox2.installEventFilter(self)
        self.textbox3.installEventFilter(self)
        self.lbox2.installEventFilter(self)

        # Based on focus item, I want to create some codes here.
        if fitem == "textbox1":
            print(" focus item is ", textbox1)


    def eventFilter(self, source, event):
        global fitem
        if event.type() == QEvent.FocusIn:
            if source == self.textbox1:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item1)
                self.lbox2.addItems(item1)
                fitem = "textbox1"
                print("textbox 1")

            elif source == self.textbox2:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item2)
                self.lbox2.addItems(item2)
                fitem = "textbox2"
                print("textbox 2")

            elif source == self.textbox3:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item3)
                self.lbox2.addItems(item3)
                fitem = "textbox3"
                print("textbox 3")

            elif source == self.lbox2:
                fitem = "listbox2"
                print("listbox 2")

        return super(Check, self).eventFilter(source, event)


def main():
    myapp = QApplication(sys.argv)
    mywin = Check()
    mywin.show()
    sys.exit(myapp.exec_())


if __name__ == "__main__":
    main()
    enter code here
永乐

在您的方法中,您有两个问题:

  • 您想要实现的逻辑仅在构造函数中执行一次,而eventFilter在构造对象后执行。

  • 不要滥用变量,因为它们是不好的做法,请阅读为什么全局变量有害?

逻辑是创建一个存储函数的属性,当您要实现逻辑时会调用该函数:


class Check(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Check Window")
        self.textbox1 = QLineEdit(self)
        self.textbox1.setGeometry(100, 100, 300, 30)
        self.textbox2 = QLineEdit(self)
        self.textbox2.setGeometry(100, 150, 300, 30)
        self.textbox3 = QLineEdit(self)
        self.textbox3.setGeometry(100, 200, 300, 30)

        self.lbox1 = QListWidget()
        self.lbox2 = QListWidget(self)
        self.lbox2.setGeometry(100, 250, 300, 500)
        self.textbox1.setObjectName("textbox1")
        self.textbox2.setObjectName("textbox2")
        self.textbox3.setObjectName("textbox3")

        self.textbox1.installEventFilter(self)
        self.textbox2.installEventFilter(self)
        self.textbox3.installEventFilter(self)
        self.lbox2.installEventFilter(self)

        self.fitem = None

    def eventFilter(self, source, event):
        if event.type() == QEvent.FocusIn:
            if source == self.textbox1:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item1)
                self.lbox2.addItems(item1)
                self.fitem = "textbox1"

            elif source == self.textbox2:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item2)
                self.lbox2.addItems(item2)
                self.fitem = "textbox2"

            elif source == self.textbox3:
                self.lbox1.clear()
                self.lbox2.clear()
                self.lbox1.addItems(item3)
                self.lbox2.addItems(item3)
                self.fitem = "textbox3"

            elif source == self.lbox2:
                self.fitem = "listbox2"
            self.foo()

        return super(Check, self).eventFilter(source, event)

    def foo(self):
        if self.fitem == "textbox1":
            print("test")

即使这样,我也不明白为什么您变得太复杂了,在您的情况下,使用focusChanged信号就足够了

class Check(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Check Window")
        self.textbox1 = QLineEdit()
        self.textbox2 = QLineEdit()
        self.textbox3 = QLineEdit()
        self.lbox = QListWidget()

        lay = QVBoxLayout(self)
        lay.addWidget(self.textbox1)
        lay.addWidget(self.textbox2)
        lay.addWidget(self.textbox3)
        lay.addWidget(self.lbox)

        self.mapping_list = {
            self.textbox1: item1,
            self.textbox2: item2,
            self.textbox3: item3,
        }

        QApplication.instance().focusChanged.connect(self.on_focusChanged)

    def on_focusChanged(self, old, new):
        item = self.mapping_list.get(new)
        if item is not None:
            self.lbox.clear()
            self.lbox.addItems(item)
            print(" focus item is ", new)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在事件中获取JavaScript中的变量值?

来自分类Dev

PyQt5事件过滤器对象检测

来自分类Dev

如何使在QTablewidget的过滤器中使用的菜单栏在pyqt5中可滚动?

来自分类Dev

如何在jquery中的函数外获取变量值

来自分类Dev

如何在php中获取脚本变量值

来自分类Dev

如何在php中获取脚本变量值

来自分类Dev

如何在Popen中获取Shell变量值

来自分类Dev

如何在 GATLING 中获取 javascript 变量值

来自分类Dev

如何在子类构造方法中获取父类变量值

来自分类Dev

如何从div中获取变量值

来自分类Dev

如何在 Maya 中添加事件过滤器

来自分类Dev

如何在 If 中设置变量值

来自分类Dev

在AngularJs中将变量值作为过滤器参数传递

来自分类Dev

Django模板内置过滤器:在参数中使用变量值

来自分类Dev

如何在过滤器中获取请求

来自分类Dev

我如何在过滤器中获取请求

来自分类Dev

仅当变量具有值时才对DataWeave中的变量值进行过滤,否则忽略过滤器

来自分类Dev

CodeWarrior从事件中获取变量值。

来自分类Dev

如何在PyQt5中使用按键事件

来自分类Dev

如何在 JavaScript 中为新的变量值分配一个变量值

来自分类Dev

如何在Angular 2(TypeScript)中获取正确的参考变量值?

来自分类Dev

如何在自定义HTML中获取Google Tag Manger变量值

来自分类Dev

Azure Devops如何在任务中获取安全的变量值

来自分类Dev

如何在Codeigniter中获取查询字符串变量值?

来自分类Dev

从Flutter的方法中获取一些变量值

来自分类Dev

如何在PyQt5中获取拖放索引

来自分类Dev

如何在GridView中绑定变量值?

来自分类Dev

如何在C#中更改SSIS变量值

来自分类Dev

如何在JavaScript中隐藏变量值?

Related 相关文章

热门标签

归档