用户输入的是q么python_python – 使用QCompleter进行全局输入?

看起来你将不得不实现自己的完成者.以下是使用正则表达式过滤完成的示例:

#!/usr/bin/env python

#-*- coding:utf-8 -*-

#---------

# IMPORT

#---------

import sys, random

import sip

sip.setapi('QString', 2)

sip.setapi('QVariant', 2)

from PyQt4 import QtGui, QtCore

#---------

# DEFINE

#---------

class QDialogTest(QtGui.QDialog):

def __init__(self, parent=None):

super(QDialogTest, self).__init__(parent)

self.maxVisibleItems = 7

self.lineEdit = QtGui.QLineEdit(self)

self.lineEdit.textChanged.connect(self.on_lineEdit_textChanged)

self.standardItemModel = QtGui.QStandardItemModel(self)

with open("/usr/share/dict/words", "r") as fileInput:

for line in random.sample(fileInput.readlines(), 111):

self.standardItemModel.appendRow(

QtGui.QStandardItem(line.strip())

)

self.sortFilterProxyModel = QtGui.QSortFilterProxyModel(self)

self.sortFilterProxyModel.setSourceModel(self.standardItemModel)

self.sortFilterProxyModel.setFilterKeyColumn(0)

self.tableView = QtGui.QTableView(self)

self.tableView.horizontalHeader().setStretchLastSection(True)

self.tableView.setModel(self.sortFilterProxyModel)

self.pushButtonClose = QtGui.QPushButton(self)

self.pushButtonClose.setText("Close")

self.pushButtonClose.clicked.connect(sys.exit)

self.layoutVertical = QtGui.QVBoxLayout(self)

self.layoutVertical.addWidget(self.tableView)

self.layoutVertical.addWidget(self.lineEdit)

self.layoutVertical.addWidget(self.pushButtonClose)

self.tableViewPopup = QtGui.QTableView(self)

self.tableViewPopup.setModel(self.sortFilterProxyModel)

self.tableViewPopup.setWindowFlags(QtCore.Qt.Popup)

self.tableViewPopup.setFocusPolicy(QtCore.Qt.NoFocus)

self.tableViewPopup.setFocusProxy(self.lineEdit)

self.tableViewPopup.setMouseTracking(True)

self.tableViewPopup.setEditTriggers(QtGui.QTableView.NoEditTriggers)

self.tableViewPopup.setSelectionBehavior(QtGui.QTableView.SelectRows)

self.tableViewPopup.setFrameStyle(QtGui.QFrame.Box | QtGui.QFrame.Plain)

self.tableViewPopup.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

self.tableViewPopup.horizontalHeader().setStretchLastSection(True)

self.tableViewPopup.horizontalHeader().hide()

self.tableViewPopup.verticalHeader().hide()

self.tableViewPopup.verticalHeader().setDefaultSectionSize(20)

self.tableViewPopup.doubleClicked.connect(self.setCurrentCompletion)

self.tableViewPopup.installEventFilter(self)

def setCurrentCompletion(self):

self.closePopup()

indexes = self.tableViewPopup.selectionModel().selectedIndexes()

self.lineEdit.blockSignals(True)

self.lineEdit.setText(indexes[0].data(QtCore.Qt.DisplayRole))

self.lineEdit.blockSignals(False)

def closePopup(self):

self.tableViewPopup.hide()

self.lineEdit.setFocus()

def eventFilter(self, obj, event):

if obj != self.tableViewPopup:

return False

elif event.type() == QtCore.QEvent.MouseButtonPress:

self.closePopup()

elif event.type() == QtCore.QEvent.KeyPress:

if event.key() in [

QtCore.Qt.Key_Enter,

QtCore.Qt.Key_Return

]:

self.setCurrentCompletion()

elif event.key() in [

QtCore.Qt.Key_Escape

]:

self.closePopup()

elif not event.key() in [

QtCore.Qt.Key_Up,

QtCore.Qt.Key_Down,

QtCore.Qt.Key_Home,

QtCore.Qt.Key_End,

QtCore.Qt.Key_PageUp,

QtCore.Qt.Key_PageDown

]:

self.lineEdit.event(event)

return super(QDialogTest, self).eventFilter(obj, event)

@QtCore.pyqtSlot(str)

def on_lineEdit_textChanged(self, text):

self.tableViewPopup.hide()

if text != "":

self.setCompletionPrefix(text)

def setCompletionPrefix(self, prefix):

self.sortFilterProxyModel.setFilterRegExp(QtCore.QRegExp(prefix))

if self.sortFilterProxyModel.rowCount():

self.complete()

def complete(self):

self.tableViewPopup.move(

self.lineEdit.mapToGlobal(

QtCore.QPoint(0, self.lineEdit.height())

)

)

self.tableViewPopup.resize(

self.lineEdit.width(),

self.tableViewPopup.verticalHeader().defaultSectionSize() * min(

self.maxVisibleItems,

self.sortFilterProxyModel.rowCount()

) + 2

)

self.tableViewPopup.setFocus()

self.tableViewPopup.show()

#---------

# MAIN

#---------

if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

app.setApplicationName('QDialogTest')

main = QDialogTest()

main.resize(333, 333)

main.exec_()

sys.exit(app.exec_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值