【问题标题】:How to show the QListwidget selected item in QLineEdit?如何在 QLineEdit 中显示 QListwidget 所选项目?
【发布时间】:2020-10-12 13:56:37
【问题描述】:

如何在 QLineEdit 中显示 QListWidget 选定项 ? .这是我的代码。在第二个 File 行中,没有 59 到 61 有问题。 问题:属性错误,无类型。如何纠正?

在我的第一个文件 (example_main_file.py) 中,我有一个带有项目的 QLineEdit 和 QListWidget。我的第二个文件(example_source_file)有一个方法来处理/过滤来自 QLineEdit 的 QListwidget 项目,并显示 QListwidget 选定的项目。但结果并不好。

第一个文件/example_main_file.py

import sys

from PyQt5.QtWidgets import QApplication, QLineEdit, QWidget,QListWidget

from  example_source_file import Sourcefile

item = ["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"]

class Check(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Check Window")
        self.textbox = QLineEdit(self)
        self.textbox.setGeometry(100, 100, 300, 30)
        self.textbox1 = QLineEdit(self)
        self.textbox1.setGeometry(100,150,300,30)
        self.lbox1 = QListWidget()
        self.lbox2 = QListWidget(self)
        self.lbox2.setGeometry(100,200,300,500)

        self.lbox1.addItems(item)
        self.lbox2.addItems(item)

        process = Sourcefile(self.textbox, self.lbox1, self.lbox2)
        process1 = Sourcefile(self.textbox1, self.lbox1, self.lbox2)

        self.textbox.textChanged.connect(process.func_textbox_textchanged)
        self.textbox1.textChanged.connect(process1.func_textbox_textchanged)


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



if __name__ == "__main__":
    main()

第二个文件/example_source_file.py

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

flag = 1
search_text_length = 0
startitem_rowno = None
enditem_rowno = None

class Sourcefile(QObject):
    def __init__(self, textbox,listbox1,listbox2,parent=None):
        super().__init__(listbox2)
        global startitem_rowno,enditem_rowno

        self.tbox1 = textbox
        self.lbox1 = listbox1
        self.lbox2 = listbox2

        self.tbox1.installEventFilter(self)
        self.lbox2.installEventFilter(self)

        startitem_rowno = 0
        enditem_rowno = len(self.lbox2) - 1

    def eventFilter(self, source, event):
        global cursor_position, textbox_value

        if event.type() == QEvent.KeyPress and source is self.tbox1:

            if event.modifiers() == Qt.AltModifier and event.key() == Qt.Key_S:
                self.func_item_startswith()
                return True

            if event.key() == Qt.Key_Down:
                self.lbox2.setFocus()
                self.lbox2.setCurrentRow(startitem_rowno)
                cursor_position = self.tbox1.cursorPosition()
                textbox_value = self.tbox1.text()

            if event.key() == Qt.Key_Up:
                self.lbox2.setFocus()
                self.lbox2.setCurrentRow(enditem_rowno)
                
                cursor_position = self.tbox1.cursorPosition()
                textbox_value = self.tbox1.text()
 
            if event.key() == Qt.Key_Return:
                if len(self.lbox2) == 1:
                    self.lbox2.setCurrentRow(0)
                    prin = self.lbox2.currentItem().text()
                    print(prin)

        if event.type() == QEvent.KeyPress and source is self.lbox2:

            if event.key() == Qt.Key_Left or event.key() == Qt.Key_Backspace:
                self.lbox2.clearFocus()
                self.tbox1.setFocus()
            elif event.key() == Qt.Key_Return:
                prin = self.lbox2.currentItem().text()
                print(prin)
                self.tbox1.setText(prin)
                #self.label_selected_item.setText("Selected Item : " + prin)
                #self.label_selected_item.adjustSize()
                self.tbox1.setFocus()
                self.tbox1.setText(prin)
            elif event.key() == Qt.Key_Up or event.key() == Qt.Key_Down:
                pass
        return super(Sourcefile, self).eventFilter(source, event)

    def func_item_startswith(self):
        global flag, startitem_rowno, enditem_rowno
        flag = 1
        startitem_rowno = 0
        enditem_rowno = startitem_count - 1
        self.lbox2.clear()

        if startitem_count > 0:
            for item in item_startswith:
                self.lbox2.addItem(item.text())
        else:
            print("No Matching from start item")

    def func_item_normal(self):

        global falg,startitem_rowno,enditem_rowno
        flag = 0
        startitem_rowno = 0
        enditem_rowno = normal_count - 1

        self.lbox2.clear()

        if normal_count > 0:
            for item in item_normal:
                self.lbox2.addItem(item.text())

    def func_textbox_textchanged(self, txt):
        global search_text, search_text_length, total_listbox_item, availableitem_count, normal_count, startitem_count, \
            containitem_count, enditem_count, item_normal, item_startswith, item_contains, item_endswith, flag, \
            startitem_rowno, enditem_rowno

        search_text = self.tbox1.text()
        search_text_length = len(search_text)
        total_listbox_item = len(self.lbox2)

        item_normal = self.lbox1.findItems("*", Qt.MatchWildcard)
        item_startswith = self.lbox1.findItems(search_text, Qt.MatchStartsWith)

        normal_count = len(item_normal)
        startitem_count = len(item_startswith)

        self.func_item_normal()

        if search_text_length >= 1: pass
        else: flag = 1

        self.lbox2.clear()

        if flag == 1:
            self.func_item_startswith()
        else:
            self.func_item_normal()

    def listbox_clicked(self, item):
        self.tbox1.setText(item.text())
        self.tbox1.setFocus()

错误/结果

Traceback (most recent call last):
  File "D:\PyQt5_samples\example_source_file.py", line 59, in eventFilter
    prin = self.lbox2.currentItem().text()
AttributeError: 'NoneType' object has no attribute 'text'

【问题讨论】:

    标签: python pyqt pyqt5 qlistwidget


    【解决方案1】:

    说明:

    当您按下回车键时,该项目被选中,它被复制到 QLineEdit 的文本中,然后调用项目过滤器删除该项目,因此下一个项目中不再有 currentItem,因此它返回错误。

    解决办法:

    鉴于此,有两种可能的解决方案:

    • 通过返回 True 来防止事件继续触发。
    elif event.key() == Qt.Key_Return:
        item = self.lbox2.currentItem()
        self.tbox1.setText(item.text())
        self.tbox1.setFocus()
        return True
    • 验证该项目不是无。
    elif event.key() == Qt.Key_Return:
        item = self.lbox2.currentItem()
        if item is not None:
            self.tbox1.setText(item.text())
            self.tbox1.setFocus()

    【讨论】:

    • 两种代码都有效。但是如果我们使用第一个解决方案,第二个 QLineEdit 将更新而不是 First。如果我们尝试第二种解决方案,则 QLineedit 更新相同。如何解决
    • 两种代码都有效。但所有文本框都由所选项目更新。@eyllanesc
    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 2017-05-21
    • 2020-04-13
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多