Как получить элемент выбора в виде списка с помощью pyqt4

#python-2.7 #pyqt4

#python-2.7 #pyqt4

Вопрос:

Вот мой пример кода. Когда я нажимаю на элемент индекса в виде списка, я получаю элемент выбора, он работает нормально.Но я хочу получить выбранный элемент, используя стрелки вверх и вниз. Кто-нибудь, пожалуйста, может мне помочь. Заранее благодарю вас.

Ниже приведен мой код:

 import sys
from PyQt4 import QtCore,QtGui
class mtable(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.auto_search1 = QtGui.QWidget()
        self.auto_search_vbox1 = QtGui.QVBoxLayout(self.auto_search1)
        self.auto_search_vbox1.setAlignment(QtCore.Qt.AlignLeft)
        hbox1=QtGui.QHBoxLayout()
        self.le_search1 = QtGui.QLineEdit()
        self.se_btn1 = QtGui.QPushButton("Search")
        self.searchBtn = QtGui.QPushButton("Close")
        self.searchBtn.clicked.connect(self.auto_search1.close)
        self.se_btn1.clicked.connect(self.filterClicked1)
        hbox1.addWidget(self.le_search1)
        hbox1.addWidget(self.se_btn1)
        hbox1.addWidget(self.searchBtn)
        self.auto_search_vbox1.addLayout(hbox1)
        self.total_list1 =[]
        self.list1 = QtGui.QListView()
        self.list1.clicked.connect(self.on_treeView_clicked)
        self.model1 = QtGui.QStandardItemModel(self.list1)
        self.y =['one','two', 'three']
        for i in self.y:
            self.total_list1.append(i)
        for code in  self.total_list1:
            item1 = QtGui.QStandardItem(code)
            self.model1.appendRow(item1)
        self.list1.setModel(self.model1)
        self.auto_search_vbox1.addWidget(self.list1)
        self.auto_search1.show()
        self.auto_search1.resize(1000,500)
    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_treeView_clicked(self, index):
        itms = self.list1.selectedIndexes()
        for data in itms:
            print index.data().toString()
            self.le_search1.setText(index.data().toString())
            self.filterClicked1()
    def filterClicked1(self):
        print "searching logic"
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    tb = mtable()
    sys.exit(app.exec_())
  

Здесь мне нужно выбрать элемент, выделенный зеленым цветом, с помощью клавиш со стрелками, не нажимая на элемент

введите описание изображения здесь

Комментарии:

1. Я протестировал ваш код, и он работает правильно, например, я сначала нажал на «два», а затем нажал кнопку со стрелкой вверх, и выбор переместился на «один», если вы нажмете кнопку со стрелкой вниз, вы снова выберете «два», и если я снова нажму вниз, выберите «три», разве у вас нет такого поведения?

2. но я не получаю sir

3. Одно дело — выбрать элемент, а другое — щелкнуть, я думаю, вы путаете оба события. При щелчке он выбирается, но с помощью стрелок вы выбираете, но не нажимаете, поэтому в последнем случае сигнал нажатия не будет отправлен.

4. Когда вы говорите: я не получаю два , вы имеете в виду, что «два» не отображается в QLineEdit?

5. Что вы подразумеваете под выбором? Вы имеете в виду, что он отображается в QLineEdit?

Ответ №1:

Вы должны использовать currentChanged сигнал selectionModel() QListView:

 import sys
from PyQt4 import QtCore,QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.lineedit = QtGui.QLineEdit()
        self.search_button = QtGui.QPushButton("Search")
        self.close_button = QtGui.QPushButton("Close")
        self.listview = QtGui.QListView()
        model = QtGui.QStandardItemModel(self.listview)
        for e in ('one', 'two', 'three'):
            model.appendRow(QtGui.QStandardItem(e))
        self.listview.setModel(model)

        # signals connections
        self.listview.selectionModel().currentChanged.connect(self.on_currentChanged)

        QtCore.QTimer.singleShot(0, self.selectFirstItem)

        # layout
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)
        vlay = QtGui.QVBoxLayout(central_widget)
        hlay = QtGui.QHBoxLayout()
        hlay.addWidget(self.lineedit)
        hlay.addWidget(self.search_button)
        hlay.addWidget(self.close_button)
        vlay.addLayout(hlay)
        vlay.addWidget(self.listview)

        self.resize(640, 480)

    def selectFirstItem(self):
        self.listview.setFocus()
        ix = self.listview.model().index(0, 0)
        self.listview.selectionModel().setCurrentIndex(ix, QtGui.QItemSelectionModel.Select)

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_currentChanged(self, current):
        self.lineedit.setText(current.data())


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())