如何从Qlistwidget中选择项目,并更新Pyqt5中的文本框?

库玛

通过Keyboard(按键事件)从QListWidget中选择项,效果很好。

但同时,我也想通过鼠标单击从QListWidget中选择Item。

尝试使用“ itemclicked.connect”,但它不符合我的预期。

我的代码在这里:

文件1(文件名:example_main_001.py):

   import sys
    
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import  *
    from PyQt5.QtGui import *
    
    from example_source_file_001 import Sourcefile
    
    textbox_items = {
        "textbox1": ["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"],
    
        "textbox2": ["India","America","Russia","China","England","Iran","Iraq","Ice Land"],
    
        "textbox3": ["Red", "Dark red", "Light Red", "Redish Blue", "Redish Green", "Green","Blue","Dark 
 Blue", "Dark Green"]
        }
    
    
    class Mclick_sample_main(QWidget):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("Mouse click Samples")
            self.textbox1 = QLineEdit()
            self.textbox2 = QLineEdit()
            self.textbox3 = QLineEdit()
            self.lbox1 = QListWidget()
            self.lbox2 = QListWidget()
    
            self.textbox1.setObjectName("textbox1")
            self.textbox2.setObjectName("textbox2")
            self.textbox3.setObjectName("textbox3")
            self.lbox1.setObjectName("listbox1")
            self.lbox2.setObjectName("listbox2")
    
            vbox = QVBoxLayout(self)
            vbox.addWidget(self.textbox1)
            vbox.addWidget(self.textbox2)
            vbox.addWidget(self.textbox3)
            vbox.addWidget(self.lbox2)
    
            self.current_textbox = None
            QApplication.instance().focusChanged.connect(self.on_focusChanged)
    
            self.textbox1.returnPressed.connect(lambda: self.textbox2.setFocus(Qt.ShortcutFocusReason))
            self.textbox2.returnPressed.connect(lambda: self.textbox3.setFocus(Qt.ShortcutFocusReason))
            self.textbox3.returnPressed.connect(lambda: self.textbox1.setFocus(Qt.ShortcutFocusReason))
    
        def on_focusChanged(self, old, new):
            fwidget = QApplication.focusWidget()
            if fwidget is not None:
    
                if isinstance(new, QLineEdit) and new != self.current_textbox:
                    self.current_textbox = new
                    self.lbox1.clear()
                    self.lbox1.addItems(textbox_items[new.objectName()])
                    self.lbox2.clear()
                    self.lbox2.addItems(textbox_items[new.objectName()])
    
                    self.getdetails_1 = Sourcefile(self.current_textbox, self.lbox1, self.lbox2)
                    self.current_textbox.textChanged.connect(self.getdetails_1.func_textbox_textchanged)
    
    def main():
        myapp = QApplication(sys.argv)
        mywin = Mclick_sample_main()
        mywin.show()
        sys.exit(myapp.exec_())
    
    
    if __name__ == "__main__":
        main()

文件2(文件名:example_source_file_001.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
selected_item = None
selec_item = None


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

        self.setFocusPolicy(Qt.StrongFocus)
        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,selected_item


        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:
                pass



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

            if event.key() == Qt.Key_Left or event.key() == Qt.Key_Backspace:
                self.tbox1.setFocus()
                return True

            elif event.key() == Qt.Key_Return :
                self.selected_item = self.lbox2.currentItem().text()

                if self.selected_item is not None:
                    self.tbox1.setText(self.selected_item)
                    self.tbox1.setFocus()
                    return True
            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()
尼克

抱歉,我不太了解您的示例,但是我尝试添加itemClicked.connect我标记了所做的更改。试试看:

example_main_001.py

import sys

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

from example_source_file_001 import Sourcefile

textbox_items = {
    "textbox1": ["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"],

    "textbox2": ["India","America","Russia","China","England","Iran","Iraq","Ice Land"],

    "textbox3": ["Red", "Dark red", "Light Red", "Redish Blue", "Redish Green", "Green","Blue",
                 "Dark Blue", "Dark Green"]
    }


class ListWidget(QListWidget):                                               # +++
    def __init__(self, parent=None):                                         # +++
        super(ListWidget, self).__init__(parent)                             # +++
        
    def _clicked(self, item):                                                # +++
        self.window().old.setText(item.text())                               # +++
        

class Mclick_sample_main(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Mouse click Samples")
        self.textbox1 = QLineEdit()
        self.textbox2 = QLineEdit()
        self.textbox3 = QLineEdit()
        self.lbox1 = QListWidget()

        self.old, self.new = None, None                                      # +++ 
#        self.lbox2 = QListWidget()                                          # ---
        self.lbox2 = ListWidget(self)                                        # +++ 
        self.lbox2.itemClicked.connect(self.lbox2._clicked)                  # +++

        self.textbox1.setObjectName("textbox1")
        self.textbox2.setObjectName("textbox2")
        self.textbox3.setObjectName("textbox3")
        self.lbox1.setObjectName("listbox1")
        self.lbox2.setObjectName("listbox2")

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.textbox1)
        vbox.addWidget(self.textbox2)
        vbox.addWidget(self.textbox3)
        vbox.addWidget(self.lbox2)

        self.current_textbox = None
        QApplication.instance().focusChanged.connect(self.on_focusChanged)

        self.textbox1.returnPressed.connect(lambda: self.textbox2.setFocus(Qt.ShortcutFocusReason))
        self.textbox2.returnPressed.connect(lambda: self.textbox3.setFocus(Qt.ShortcutFocusReason))
        self.textbox3.returnPressed.connect(lambda: self.textbox1.setFocus(Qt.ShortcutFocusReason))

    def on_focusChanged(self, old, new):
        fwidget = QApplication.focusWidget()
        
        self.old, self.new = old, new                                        # +++
        
        if fwidget is not None:

            if isinstance(new, QLineEdit) and new != self.current_textbox:
                self.current_textbox = new
                self.lbox1.clear()
                self.lbox1.addItems(textbox_items[new.objectName()])
                self.lbox2.clear()
                self.lbox2.addItems(textbox_items[new.objectName()])

                self.getdetails_1 = Sourcefile(self.current_textbox, self.lbox1, self.lbox2)
                self.current_textbox.textChanged.connect(self.getdetails_1.func_textbox_textchanged)


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


if __name__ == "__main__":
    main()
    

在此处输入图片说明

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从scrollview的imageview中选择项目?

选择框从模型中选择项目

如何从FlatList中选择项目?

从PyQt5中的QListWidget删除项目

如何从列表中选择项目

如何通过键在组合框中选择项目?

如何获取所有项目存在于PyQt5中的QlistWidget中

如何在文本框中选择文本

即使在角度5的taginput中选择选项后,如何清除保留在文本框中的键入的值

在PyQt5中的QTreeWidget和QListWidget之间拖动项目?

使用PyQt5在文本框中打印输出语句

无法使用pyqt5从表格视图中的已选择项目中选择单个项目

如何从pyqt5中的QListWidget返回实际对象

如何使用JavaScript获取文本框中选择框的所有项目

如何从QListView中选择项目?

我如何从列表中选择项目

在Java的组合框中选择项目时更新JTable

如何在ListView中选择项目?

从包含从自动完成的文本框中选择的项目的列表中删除项目

从列表视图中选择项目后,从数组更改文本框文本值

如何使用 PyQt5 添加到 Python 文本框中的默认上下文菜单?

如何从 Senchat 测试的组合框中选择项目

在 Javascript 中从 JSON 中选择项目

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中?(QComboBox 有复选框来选择项目)

如何检查QlistWidget中的项目并在python pyqt5中的选定项目上运行函数

如何检查QlistWidget中的项目并在python pyqt5中的选定项目上运行函数

使用硒在角度选择框中选择项目

如何在pyqt5 QlistWidget中选择当前项目

Pyqt5 如何在选择组合框中的下拉列表后创建文本框