今天我們繼續玩表格, 我們這次要把在 Day04 用的 QDialog 放進表格裡
今天我們就專心在一個三成三的表格好了, 每一格都是輸入框, 要多加甚麼功能等等在說
import sys
from PySide6.QtGui import QIcon
from PySide6 import QtWidgets
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 = QtWidgets.QLineEdit("")
self.setCellWidget(i, 0, servantInput)
servantInput = QtWidgets.QLineEdit("")
self.setCellWidget(i, 1, servantInput)
servantInput = QtWidgets.QLineEdit("")
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 後又會變回不可編輯狀態
我們先試試把所有格子利用 setDisabled(True) 變成灰色的不可編輯狀態
但是在這裡發現, 如果使用 setDisabled 的話, 點到格子上, 行列的文字不會跟之前一樣變粗
如下圖
仔細看滑鼠點被 Disable 的格子時, 行列上的文字並沒有變化, 如果滑鼠點到一般格子的話, 行列上的 1 2 3 跟 I II III 有加粗
想看的更清楚一點的話, 可以在 QTableWidget 裡設定
setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
這樣剛剛同樣的畫面跟動作就會變成
所以 setDisabled 不是我們要的功能, 找了一下後發現有個 setReadOnly 的功能
點點看
不過我寫到這邊的時候發現, QTableWidget 好像有內建的表格編輯功能.....
可是頭都已經洗下去了, 只好繼續下去, 希望能做出更多編輯花樣的表格
這次因為需要雙擊, 所以一樣把 QLineEdit 拉出來自成一個 class
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)
def mouseDoubleClickEvent(self, event):
self.setReadOnly(False)
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 後完成編輯