我想要的是对齐 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)
Run Code Online (Sandbox Code Playgroud)
这是问题 1。如何将 chekbox 的 QtableWidget 项目对齐到中心。
通过一些谷歌搜索,我发现 cellwidget 确实有效。所以我尝试将代码更改为cellWidgetnot 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)
Run Code Online (Sandbox Code Playgroud)
这是我需要的对齐复选框。但让其他事情成为问题。
问题2.使用cellwidget,如何将所有checkbox 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
Run Code Online (Sandbox Code Playgroud)
并将以下代码放在上面self.tableWidget.setFocusPolicy(False)
delegate = AlignDelegate(self.tableWidget)
self.tableWidget.setItemDelegateForColumn(1, delegate)
Run Code Online (Sandbox Code Playgroud)
不知道为什么。但不起作用。 问题5.为什么不起作用?
这是我的程序的屏幕截图。
如果你能解决问题1,那对我来说就足够了。
因为其他答案会让我更改以下所有代码。
其他问题只是告诉我尝试过,但它们会带来更多问题。
如果你想让复选框居中,那么你必须使用 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_())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1825 次 |
| 最近记录: |