iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Software Development

[Python QT] 玩玩 Pyside 的各種功能系列 第 9

【Day09】把 QDialog 文字輸入框放進 QTableWidget 表格 上

  • 分享至 

  • xImage
  •  

今天我們繼續玩表格, 我們這次要把在 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())

展示一下初始外觀
https://ithelp.ithome.com.tw/upload/images/20220911/20151144DpbHN3W0e9.png

非常的簡單粗暴

但是我們當然不會在這裡就滿足, 這次想嘗試一開始所有表格都是不可編輯狀態, 只有雙擊時才會變成可編輯, 使用者按下 ENTER 後又會變回不可編輯狀態
我們先試試把所有格子利用 setDisabled(True) 變成灰色的不可編輯狀態
https://ithelp.ithome.com.tw/upload/images/20220911/20151144xrgb5ccrkC.png
但是在這裡發現, 如果使用 setDisabled 的話, 點到格子上, 行列的文字不會跟之前一樣變粗
如下圖
DISABLE
仔細看滑鼠點被 Disable 的格子時, 行列上的文字並沒有變化, 如果滑鼠點到一般格子的話, 行列上的 1 2 3 跟 I II III 有加粗
想看的更清楚一點的話, 可以在 QTableWidget 裡設定
setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
這樣剛剛同樣的畫面跟動作就會變成
HL
所以 setDisabled 不是我們要的功能, 找了一下後發現有個 setReadOnly 的功能
點點看
ro

不過我寫到這邊的時候發現, 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())

途中展示如下
QQQQQ

明天來嘗試 ENTER 後完成編輯


上一篇
【Day08】把 QPushButton 按鈕放進 QTableWidget 表格 續
下一篇
【Day10】把 QLineEdit文字輸入框放進 QTableWidget 表格 下
系列文
[Python QT] 玩玩 Pyside 的各種功能31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言