正確取消選中Qtablewiget中的項目我創建了一個包含三列的表格窗口小部件。該表位於qwizard內部。它通過讀取文件並將該文件的行放入第一列來填充。它看起來像下面的圖片。基本上,我想程序的行爲是這樣的:如何根據條件
如果兩個
remove half of item
和remove all of item
進行檢查,取消remove half of item
只留下remove all of item
爲row.Then行添加到文件中。按OK按鈕
否則,如果只
remove half of item
或remove all of item
檢查執行它。將該行添加到文件中。按OK按鈕
的問題是,它與我的期望輸出結束了,但只有當我按OK多次 處理該行爲的功能執行它是def print_checked(self):
和def setChoice(self, item):
from PyQt4 import QtCore, QtGui
import sys
class TablePage(QtGui.QWizardPage):
def __init__(self, parent=None):
super(TablePage, self).__init__(parent)
self.isWrittenTo = False
self.table = QtGui.QTableWidget()
self.table.setGeometry(200, 200, 200, 200)
self.configureTable(self.table)
self.table.verticalHeader().hide()
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok)
self.horizontalLayout = QtGui.QHBoxLayout()
self.verticalLayout = QtGui.QVBoxLayout(self)
self.horizontalLayout.addWidget(self.table)
self.verticalLayout.addLayout(self.horizontalLayout)
self.verticalLayout.addWidget(self.buttonBox)
self.buttonBox.accepted.connect(self.print_checked)
self.buttonBox.rejected.connect(self.close)
self.choice = []
self.table.itemChanged.connect(self.setChoice)
def configureTable(self, table):
rowf = 0
rowx = 0
table.setColumnCount(3)
table.setHorizontalHeaderItem(0, QtGui.QTableWidgetItem("Whole items"))
table.setHorizontalHeaderItem(1, QtGui.QTableWidgetItem("remove half of item"))
table.setHorizontalHeaderItem(2, QtGui.QTableWidgetItem("remove all of item"))
header = table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
table.horizontalHeader().setStretchLastSection(True)
item_list = []
with open("/home/test1/items.txt") as in_file:
if in_file is not None:
xvar = in_file.readlines()
for line in xvar:
item_list.append(line)
rowf += 1
table.setRowCount(rowf)
for linex in item_list:
x = QtGui.QTableWidgetItem()
table.setItem(rowx, 0, x)
rowx += 1
x.setText(linex)
for column in range(3):
for row in range(rowf):
if column % 3:
self.item = QtGui.QTableWidgetItem(column)
self.item.setFlags(QtCore.Qt.ItemIsUserCheckable |
QtCore.Qt.ItemIsEnabled)
self.item.setCheckState(QtCore.Qt.Unchecked)
self.item.setTextAlignment(QtCore.Qt.AlignHCenter)
table.setItem(row, column, self.item)
def setChoice(self, item):
if item.checkState() == QtCore.Qt.Checked:
self.choice.append(item)
if item.checkState() == QtCore.Qt.Unchecked:
self.choice.remove(item)
def print_checked(self):
path = '/home/test1/items-to-mod.txt'
mode = 'a' if self.isWrittenTo else 'w'
user = self.table
if len(self.choice) > 0:
with open(path, mode) as f:
for item in self.choice:
delete = user.horizontalHeaderItem(item.column()).text()
if delete == "remove all of item" and user.item(item.row(), 1).checkState() == QtCore.Qt.Checked:
user.item(item.row(), 1).setCheckState(QtCore.Qt.Unchecked)
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('fully remove %s' % user.item(item.row(), 0).text())
elif delete == "remove half of item":
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('remove half of %s' % user.item(item.row(), 0).text())
elif delete == "remove all of item":
print ('%s' % user.item(item.row(), 0).text() + 'is marked for %s' % delete)
f.write('fully remove %s' % user.item(item.row(), 0).text())
else:
print('%s' % item.text())
print (item.row(), item.column())
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
wizard = QtGui.QWizard()
tablepage = TablePage()
wizard.addPage(tablepage)
wizard.button(QtGui.QWizard.NextButton).clicked.connect(tablepage.print_checked)
wizard.show()
sys.exit(app.exec_())
我無法理解您的要求。在這兩種情況下是添加到文件的行?在第一種情況下:是否僅在刪除一半項目時才移除支票? – eyllanesc
是的,該行被添加到文件中,但我必須一直按Ok按鈕才能在文件中顯示正確的輸出 – answerSeeker
另一件事是,如果您知道一種將表格單元格中的複選框居中的方法太棒了 – answerSeeker