python - 想要将焦点从第一个文本框更改为下一个文本框?
问题描述
想要将焦点从第一个文本框更改为下一个文本框,(将焦点更改为下一个孩子或上一个孩子)。当我按 Enter/Return 键时(就像 tab 键一样)。附上我的代码。(第一个文件:example_main_file.py),第二个是(example_source_file.py)。如何解决?
第一个文件 - (example_main_file.py)
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from example_source_file import Sourcefile
item1 = ["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"]
item2 = ["India","America","Russia","China","England","Iran","Iraq","Ice Land"]
item3 = ["FootBall","Volly Ball","Basket Ball","Ball","Hand Ball", "Rugby","Cricket","Long
Jump","High Jump"]
class Check(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Check Window")
self.textbox1 = QLineEdit(self)
self.textbox1.setGeometry(100, 100, 300, 30)
self.textbox2 = QLineEdit(self)
self.textbox2.setGeometry(100, 150, 300, 30)
self.textbox3 = QLineEdit(self)
self.textbox3.setGeometry(100, 200, 300, 30)
self.lbox1 = QListWidget()
self.lbox2 = QListWidget(self)
self.lbox2.setGeometry(100,250,300,500)
self.textbox1.setObjectName("textbox1")
self.textbox2.setObjectName("textbox2")
self.textbox3.setObjectName("textbox3")
self.lbox2.setObjectName("listbox2")
self.updateallwidgets()
QApplication.instance().focusChanged.connect(self.on_focusChanged)
def updateallwidgets(self):
QWidget.allwidgets = QApplication.allWidgets()
for i in QWidget.allwidgets:
j = i.objectName()
def on_focusChanged(self):
fwidget = QApplication.focusWidget()
if fwidget is not None:
if fwidget.objectName() == "textbox1":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item1)
self.lbox2.addItems(item1)
self.getdetails_1 = Sourcefile(self.textbox1,self.lbox1,self.lbox2)
self.textbox1.textChanged.connect(self.getdetails_1.func_textbox_textchanged)
elif fwidget.objectName() == "textbox2":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item2)
self.lbox2.addItems(item2)
self.getdetails_2 = Sourcefile(self.textbox2,self.lbox1,self.lbox2)
self.textbox2.textChanged.connect(self.getdetails_2.func_textbox_textchanged)
elif fwidget.objectName() == "textbox3":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item3)
self.lbox2.addItems(item3)
self.getdetails_3 = Sourcefile(self.textbox3,self.lbox1,self.lbox2)
self.textbox3.textChanged.connect(self.getdetails_3.func_textbox_textchanged)
return True
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
selected_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()
print(cursor_position)
print(textbox_value)
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:
print("return key pressed")
#self.parent().focusNextChild()
#self.focusNextPrevChild(True)
############# I am Struk here ##############
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()
def listbox_clicked(self, item):
self.tbox1.setText(item.text())
self.tbox1.setFocus()
解决方案
您可以连接returnPressed
QLineEdits 的信号以设置下一个小部件的焦点,例如
self.textbox1.returnPressed.connect(lambda: self.textbox2.setFocus(Qt.ShortcutFocusReason))
此外,您可以objectName
使用关键字参数设置您的小部件并保存一行代码,例如
self.textbox1 = QLineEdit(self, objectName = 'textbox1')
我只使用了你的 example_main_file.py。我认为这给出了你想要的行为:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
# ~ from example_source_file import Sourcefile
item1 = ["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"]
item2 = ["India","America","Russia","China","England","Iran","Iraq","Ice Land"]
item3 = ["FootBall","Volly Ball","Basket Ball","Ball","Hand Ball",
"Rugby","Cricket", "Long Jump","High Jump"]
class Check(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Check Window")
self.textbox1 = QLineEdit(self, objectName = 'textbox1')
self.textbox1.setGeometry(100, 100, 300, 30)
self.textbox2 = QLineEdit(self, objectName = 'textbox2')
self.textbox2.setGeometry(100, 150, 300, 30)
self.textbox3 = QLineEdit(self, objectName = 'textbox3')
self.textbox3.setGeometry(100, 200, 300, 30)
self.lbox1 = QListWidget()
self.lbox2 = QListWidget(self, objectName = 'listbox2')
self.lbox2.setGeometry(100,250,300,500)
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.lbox2.setFocus(Qt.ShortcutFocusReason))
self.updateallwidgets()
QApplication.instance().focusChanged.connect(self.on_focusChanged)
def updateallwidgets(self):
QWidget.allwidgets = QApplication.allWidgets()
for i in QWidget.allwidgets:
j = i.objectName()
def on_focusChanged(self):
fwidget = QApplication.focusWidget()
if fwidget is not None:
if fwidget.objectName() == "textbox1":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item1)
self.lbox2.addItems(item1)
# ~ self.getdetails_1 = Sourcefile(self.textbox1,self.lbox1,self.lbox2)
# ~ self.textbox1.textChanged.connect(self.getdetails_1.func_textbox_textchanged)
elif fwidget.objectName() == "textbox2":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item2)
self.lbox2.addItems(item2)
# ~ self.getdetails_2 = Sourcefile(self.textbox2,self.lbox1,self.lbox2)
# ~ self.textbox2.textChanged.connect(self.getdetails_2.func_textbox_textchanged)
elif fwidget.objectName() == "textbox3":
self.lbox1.clear()
self.lbox2.clear()
self.lbox1.addItems(item3)
self.lbox2.addItems(item3)
# ~ self.getdetails_3 = Sourcefile(self.textbox3,self.lbox1,self.lbox2)
# ~ self.textbox3.textChanged.connect(self.getdetails_3.func_textbox_textchanged)
return True
def main():
myapp = QApplication(sys.argv)
mywin = Check()
mywin.show()
sys.exit(myapp.exec_())
if __name__ == "__main__":
main()
推荐阅读
- python - 双线性/双三次插值是否在每个颜色通道上独立运行?
- reactjs - 在 VS Code 中搜索 React 组件
- c# - 有没有办法让 RazorEngine 抛出异常,使用 JSON 作为数据模型渲染模板?
- php - 为什么我的 for 循环只抓取第一个元素?
- android - 不调用 BLE 功能
- javascript - 用于显示我在 phonegap 应用上收听的音乐的 Javascript 代码
- na - GAM 回归 (mgcv) 如何处理重复值?
- php - 没有默认值的函数参数,我是否需要检查是否已定义?
- ios - iOS 扩展和试飞
- selenium - 使用 Nightwatch.js 时如何缩小特定网页?