3つの列を持つ表ウィジェットを作成しました。テーブルはクワイアの内側にあります。ファイルを読み込み、そのファイルの行を最初の列に置くことで、ファイルが作成されます。下の写真のように見えます。基本的に私はこのように動作するプログラムを希望:条件に基づいてQtablewigetの項目を正しく選択解除する方法
両方
はOKボタンremove half of item
とremove all of item
がチェックされている場合は、remove half of item
は、ファイルに行を追加するだけremove all of item
row.Thenのために残してオフにします。そうでない場合にのみ
remove half of item
またはremove all of item
がチェックされている場合を押して実行します。ファイルに行を追加します。問題は、それが私の所望の出力に終わるということですが、私は[OK]を複数回押した場合にのみ動作を扱う 機能が
def print_checked(self):
とdef setChoice(self, item):
ある
OKボタンを押すことによって、それを実行します
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
もう1つのこと、テーブルセルにチェックボックスを中央に配置する方法が分かっている場合素晴らしいことがある – answerSeeker