寫這篇文章時才發現, 昨天的標題打錯了, 應該是 QLineEdit 而不是 QDialog, 不知道過時間後在去改標題會不會算超時, 第一次參加就不冒險了, 繼續留著, 第 30 天後再改吧
今天繼續把昨天的目標, 在查了一些資料後, 尤其是官方資料, 發現 QLineEdit 本身帶有 returnPressed() 這個 Signal, 所以我們就拿這個來連接上我們要的功能吧
改動超少, 程式碼如下
import sys
from PySide6.QtGui import QIcon
from PySide6 import QtWidgets
class MyLineEdit(QtWidgets.QLineEdit):
def __init__(self):
super(MyLineEdit, self).__init__()
self.setText("")
self.setReadOnly(True)
self.returnPressed.connect(self.editDone)
def mouseDoubleClickEvent(self, event):
self.setReadOnly(False)
def editDone(self):
self.setReadOnly(True)
class MyWidget(QtWidgets.QTableWidget):
def __init__(self):
super().__init__()
self.setRowCount(3)
self.setColumnCount(3)
self.setHorizontalHeaderLabels(["I", "II", "III"])
for i in range(3):
servantInput = MyLineEdit()
self.setCellWidget(i, 0, servantInput)
servantInput = MyLineEdit()
self.setCellWidget(i, 1, servantInput)
servantInput = MyLineEdit()
self.setCellWidget(i, 2, servantInput)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
QtWidgets.QApplication.setApplicationName("Hello")
QtWidgets.QApplication.setWindowIcon(QIcon("214.png"))
table = MyWidget()
table.resize(350, 150)
table.show()
sys.exit(app.exec())
結果展示
但是在這裡有發現一個不完美的地方, 就是只有案下 Enter 的時候, 正在編輯的格子才會變成非編輯模式, 如果在編輯某個格子時, 沒有案 Enter 就雙擊另一格的話, 前一格不會變回非編輯模式
上述情境展示
這樣的話就要用別的方式實現讓使用者正在編輯的格子只有一格
目前想到的方法是, 當使用者雙擊某一格當下, 其他格全部變成不可編輯狀態, 就按照這個方法執行吧
由於這個想法不能只在每個 QLineEdit 內自己完成, 需要到整個 QTableWidget , 因此在這裡需要使用到 Signal&Slot 來將某個 QLineEdit 正在編輯的訊號傳到整個表格, 然後設定所有的 QLineEdit
import sys
from PySide6.QtCore import Signal, Slot
from PySide6.QtGui import QIcon
from PySide6 import QtWidgets
class MyLineEdit(QtWidgets.QLineEdit):
signal_enter = Signal()
def __init__(self):
super(MyLineEdit, self).__init__()
self.setText("")
self.setReadOnly(True)
self.returnPressed.connect(self.editDone)
def mouseDoubleClickEvent(self, event):
self.signal_enter.emit()
self.setReadOnly(False)
def editDone(self):
self.setReadOnly(True)
class MyWidget(QtWidgets.QTableWidget):
def __init__(self):
super().__init__()
self.setRowCount(3)
self.setColumnCount(3)
self.setHorizontalHeaderLabels(["I", "II", "III"])
for i in range(3):
servantInput = MyLineEdit()
servantInput.signal_enter.connect(self.allCellReadOnly)
self.setCellWidget(i, 0, servantInput)
servantInput = MyLineEdit()
servantInput.signal_enter.connect(self.allCellReadOnly)
self.setCellWidget(i, 1, servantInput)
servantInput = MyLineEdit()
servantInput.signal_enter.connect(self.allCellReadOnly)
self.setCellWidget(i, 2, servantInput)
def allCellReadOnly(self):
rCount = self.rowCount()
cCount = self.columnCount()
for i in range(rCount):
for j in range(cCount):
cell = self.cellWidget(i, j)
cell.setReadOnly(True)
if __name__ == "__main__":
app = QtWidgets.QApplication([])
QtWidgets.QApplication.setApplicationName("Hello")
QtWidgets.QApplication.setWindowIcon(QIcon("214.png"))
table = MyWidget()
table.resize(350, 150)
table.show()
sys.exit(app.exec())
在這裡我們使用 cellWidget() 來取得表格內的內容物然後修改
最終展示如下