2014-01-17 5 views
0

У меня есть вопрос о том, как фильтровать элементы из ListWidget через выбор поле со спискомсписок фильтрации с QComboBox и QLineEdit

Пример, в моем ListWidget, есть желтый 01, желтый 02, голубой 01, красный 01, красный 02 и Red 03 Принимая во внимание, что в моем поле со списком есть Желтый, Синий и Красный

Я думаю, вы получили его суть, где, если пользователь выберет опцию «Красный» в поле со списком, ListWidget отобразит Red 01, Red 02 , Red 03 ... И то же самое касается двух других вариантов.

Может ли кто-нибудь вести меня в этом вопросе?

Кстати, из любопытства, может ли это быть сделано, если бы я должен был интегрировать другое текстовое поле (QLineEdit), всего 3 элемента и работать ли они с теми же функциями, что и поле со списком?

P.S: Информация читает из каталога и, следовательно, это немного сложнее, я думаю,

+0

Я не знаком с Python. Можете ли вы использовать карту со строкой в ​​качестве ключа и список строк в качестве значений? Затем вы можете использовать выбранную строку и показать соответствующие значения ... –

+0

Привет, walle, я действительно не понимаю, что вы имеете в виду ... Я довольно новичок в языке python. Эмм, не могли бы вы подробнее рассказать об этом? – yan

+0

В python его названный [словарь] (http://docs.python.org/2/library/stdtypes.html#typesmapping). Ключ - 'QString', а значение -' QVector '. Затем вы можете взять строку combobox как ключ и получить записи listwidget из соответствующего значения. –

ответ

1

Предположим, что вы создали файл myDialog.ui щ с дизайнером. QListWidget и QComboBox называются comboBox и listWidget. Чтобы обновить QListWidget, я предлагаю такой подход:

#!/usr/bin/env python 
# -*- coding: utf-8 *- 

import sys 
import os 

from PyQt4 import QtGui, QtCore, uic 

app = QtGui.QApplication(sys.argv) 

class MyDialog(QtGui.QDialog): 
    def __init__(self): 
    QtGui.QDialog.__init__(self) 
    uic.loadUi(os.path.join(os.path.dirname(os.path.abspath(__file__)),"myDialog.ui"), self) 
    self.comboBox.currentIndexChanged.connect(self.updateList) 
    self.comboBox.clear() 
    self.comboBox.insertItems(0,self.getFilters()) 
    self.updateList() 
    pass 

    def updateList(self): 
    items = self.getListItems() 
    text_filter = str(self.comboBox.currentText()) 
    self.listWidget.clear() 
    # If "All" is used, no filter is applied 
    self.listWidget.insertItems(0,[text for text in items if text_filter in text + "All"]) 
    pass 

    def getFilters(self): 
    # Write here your own method to retrieve the filters 
    return ["Yellow", "Blue", "Red", "All"] 

    def getListItems(self): 
    # Write here your own method to retrieve the list values 
    return ["Yellow 01", "Yellow 02", "Blue 01", "Red 01", "Red 02", "Red 03 "] 

myDialog = MyDialog() 
myDialog.show() 
sys.exit(app.exec_()) 
+0

Привет, Фродон, спасибо, что вернулись ко мне. У меня есть вопрос, в котором я предполагал, что ваше кодирование означает, что я должен делать ручной ввод? Например, мне нужно будет определить, что, когда в выпадающем списке выбрано Желтый, я должен напечатать все слова, содержащие Желтый под обновлением списка? Я прав? – yan

+0

Операция фильтрации уже выполнена в моем примере. Вам просто нужно переписать методы getFilters и getListItems для заполнения comboBox и listWidget своими собственными данными. Например, значения для listWidget могут быть содержимым каталога (каталоги и файлы). Вы должны написать эту часть. – Frodon