1 回答

TA貢獻1859條經驗 獲得超6個贊
問題可能是線路self.tbox1.setFocus()導致focusChanged信號再次發射。QListWidget 被清除并重新進貨,因此沒有當前項目文本,文本框設置為空字符串,給人一種“無響應”的感覺。無論如何,我在嘗試運行代碼時遇到了分段錯誤,所以我不得不更改它。
所有的信號和槽連接都可以在主類中完成。從 QListWidget 中選擇一個項目可以用currentTextChanged信號檢測。在 focusChanged 上,保持指向最新聚焦的 QLineEdit 的指針?,F在,當從列表小部件中選擇一個項目時,您可以將文本設置為正確的文本框并重新對其應用焦點。
import sys
from PyQt5.QtWidgets import *
textbox_items = {
"textbox1": ["Red", "Green", "Blue", "Brown", "White", "Black", "Grey",
"Dark Red", "Dark Green", "Dark Blue"],
"textbox2": ["Gold", "Silver", "Bronze", "Copper", "Iron", "Aluminium",
"Taitanium"],
"textbox3": ["Indian Ocean", "Arabian Sea", "Bay of Bengal", "Black Sea",
"Pacific Ocean"]
}
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.listbox1 = QListWidget()
self.listbox1.currentTextChanged[str].connect(self.update_textbox)
self.textbox1.setObjectName("textbox1")
self.textbox2.setObjectName("textbox2")
self.textbox3.setObjectName("textbox3")
self.listbox1.setObjectName("listbox1")
vbox = QVBoxLayout(self)
vbox.addWidget(self.textbox1)
vbox.addWidget(self.textbox2)
vbox.addWidget(self.textbox3)
vbox.addWidget(self.listbox1)
self.current_textbox = None
QApplication.instance().focusChanged.connect(self.on_focusChanged)
def on_focusChanged(self, old, new):
if isinstance(new, QLineEdit) and new != self.current_textbox:
self.current_textbox = new
self.listbox1.clear()
self.listbox1.addItems(textbox_items[new.objectName()])
def update_textbox(self, text):
if text:
self.current_textbox.setText(text)
self.current_textbox.setFocus()
def main():
myapp = QApplication(sys.argv)
mywin = Mclick_sample_main()
mywin.show()
sys.exit(myapp.exec_())
if __name__ == "__main__":
main()
添加回答
舉報