【发布时间】:2016-12-30 02:48:18
【问题描述】:
我创建了一个包含三列的表格小部件。该表位于 qwizard 内。它通过读取文件并将该文件的行放在其第一列中来填充。它看起来像下面的图片。基本上我希望程序以这种方式运行:
-
如果
remove half of item和remove all of item都被选中,请取消选中remove half of item,只留下remove all of item作为行。然后将该行添加到文件中。按确定按钮执行
-
否则,如果仅选中
remove half of item或remove all of item。将该行添加到文件中。按确定按钮执行
问题是它最终得到了我想要的输出,但前提是我多次按确定
处理该行为的函数是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_())
【问题讨论】:
-
我无法理解您的要求。在这两种情况下,是否将行添加到文件中?在第一种情况下:检查是否仅在删除一半项目时被删除?
-
是的,该行已添加到文件中,但我必须按住确定按钮才能在文件中显示正确的输出
-
另外一件事,如果你知道一种方法可以让表格单元格中的复选框居中,那就太棒了
标签: python python-2.7 pyqt pyqt4