iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Software Development

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

【Day10】把 QLineEdit文字輸入框放進 QTableWidget 表格 下

  • 分享至 

  • xImage
  •  

寫這篇文章時才發現, 昨天的標題打錯了, 應該是 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 的時候, 正在編輯的格子才會變成非編輯模式, 如果在編輯某個格子時, 沒有案 Enter 就雙擊另一格的話, 前一格不會變回非編輯模式
上述情境展示
noenter

這樣的話就要用別的方式實現讓使用者正在編輯的格子只有一格
目前想到的方法是, 當使用者雙擊某一格當下, 其他格全部變成不可編輯狀態, 就按照這個方法執行吧
由於這個想法不能只在每個 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() 來取得表格內的內容物然後修改
最終展示如下
all


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

尚未有邦友留言

立即登入留言