Выравнивание элементов PyQt5 QTablewidget - PullRequest
0 голосов
/ 31 марта 2020

я хочу выровнять свой флажок, который находится в Qtablewidget. вот что мой сценарий похож на

mylist = [some list I made..]
for i in range(len(mylist)) :
    row_count = self.tableWidget.rowCount()
    nowset = row_count+1
    self.tableWidget.setRowCount(nowset)
    self.tableWidget.setItem( row_count, 0, QTableWidgetItem(mylist[i]))
    chkBoxItem = QTableWidgetItem()
    chkBoxItem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
    chkBoxItem.setCheckState(QtCore.Qt.Unchecked)
    self.tableWidget.setItem( i, 1, chkBoxItem)

self.tableWidget.setFocusPolicy(False)
self.tableWidget.setColumnWidth(1, 150)
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)

здесь Вопрос 1. Как я могу выровнять мой элемент QtableWidget, который является chekbox, по центру.

из некоторого поиска, который я нашел этот cellwidget работает. поэтому я попытался изменить свой код на cellWidget, а не Item. как

self.checkBoxList= []
for i in range(len(mylist)):
    ckbox = QCheckBox()
    self.checkBoxList.append(ckbox)

for i in range(len(mylist)):              
    cellWidget = QWidget()
    layoutCB = QHBoxLayout(cellWidget)
    layoutCB.addWidget(self.checkBoxList[i])
    layoutCB.setAlignment(QtCore.Qt.AlignCenter)            
    layoutCB.setContentsMargins(0,0,0,0)
    cellWidget.setLayout(layoutCB)
    self.tableWidget.setCellWidget(i,1,cellWidget)       

этот флажок выравнивания, как мне нужно. но делать другие вещи, чтобы проблема.

Вопрос 2. Используя cellwidget, как я могу установить для всех chekbox cellwidget установлен флажок.

Вопрос 3. Используя cellwidget, как узнать, какие строки проверено.

Вопрос 4. Используя cellwidget, как я могу изменить цвет ячейки.

кажется, item и cellwidget работают по-разному.

, потому что у меня есть кнопка, которая меняет все флажки на отмеченные, и

еще одна кнопка, которая получает текст столбца 0, чей флажок для той же строки установлен.

Я тоже попробовал делегировать вот так.

class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(AlignDelegate, self).initStyleOption(option, index)
        option.displayAlignment = QtCore.Qt.AlignCenter

и поставьте код ниже self.tableWidget.setFocusPolicy(False)

delegate = AlignDelegate(self.tableWidget)
self.tableWidget.setItemDelegateForColumn(1, delegate)

, не знаю почему. но не работает Вопрос 5. почему не работает?

Вот мой скриншот моей программы.

enter image description here

, если вы сможете решить вопрос 1. этого будет достаточно для меня.

потому что другой ответ заставит меня изменить весь следующий код.

другие вопросы просто говорят, что я пытался, и они создают больше проблем.

1 Ответ

2 голосов
/ 31 марта 2020

Если вы хотите центрировать флажок, вы должны использовать QProxyStyle:

from PyQt5 import QtCore, QtGui, QtWidgets


class CheckBoxStyle(QtWidgets.QProxyStyle):
    def subElementRect(self, element, option, widget=None):
        r = super().subElementRect(element, option, widget)
        if element == QtWidgets.QStyle.SE_ItemViewItemCheckIndicator:
            r.moveCenter(option.rect.center())
        return r


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        data = ["1", "2", "3", "4", "5", "6"]

        self.tableWidget = QtWidgets.QTableWidget(0, 2)
        self.setCentralWidget(self.tableWidget)

        for text in data:
            row = self.tableWidget.rowCount()
            self.tableWidget.insertRow(row)

            text_item = QtWidgets.QTableWidgetItem(text)

            checkbox_item = QtWidgets.QTableWidgetItem()
            checkbox_item.setFlags(
                QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled
            )
            checkbox_item.setCheckState(QtCore.Qt.Unchecked)

            self.tableWidget.setItem(row, 0, text_item)
            self.tableWidget.setItem(row, 1, checkbox_item)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    checkbox_style = CheckBoxStyle(app.style())
    app.setStyle(checkbox_style)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...