- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
双击表 1
的值会将值复制到表 2
。在Table 2
上按鼠标右键可从“删除”菜单中删除Table 2
中的列表。问题是,如果再次从table 1
列表中选择已删除的值,则不会重复,无法选择。 (如果table 1
列表在table 2
中重复,则不会选择它。)
有没有一种简单的方法可以在保留数据的同时删除和查看数据?现在当我将按钮和QMenu运行到代码中时,我修改单元格并在删除table1列表或table2数据时重新接收数据,并且qtableview单元格值被初始化
def Table2_CustomContextMenu(self,position):
if delete == action:
清除条件发生时索引的 self.modelListSave
值,并删除 self.mainTable2.model()。 removeRow(indexRow[0], self.mainTable2.rootIndex())
self.modelListSave
重置self.mainTable2_model
我不明白的是, self.modelListSave
和 self.mainTable2.model()
重复。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(500, 500)
self.Table1()
self.Table2()
self.Layout()
def Table1(self):
self.select_guorpbox = QGroupBox()
self.select_guorpbox.setTitle("Article 1")
self.rowcount = 10
self.columncount = 10
self.mainTable1_model = QStandardItemModel(self.rowcount, self.columncount)
# self.mainTable1_model.setHorizontalHeaderLabels(['a', 'b', 'c', 'd'])
for i in range(self.rowcount):
for j in range(self.columncount):
table = QStandardItem("TEST[{},{}]".format(i,j))
self.mainTable1_model.setItem(i, j, table)
table.setTextAlignment(Qt.AlignCenter)
self.textFilter = QSortFilterProxyModel()
self.textFilter.setSourceModel(self.mainTable1_model)
self.textFilter.setFilterKeyColumn(2)
self.SerchLineEdit = QLineEdit()
self.SerchLineEdit.textChanged.connect(self.textFilter.setFilterRegExp)
self.mainTable1 = QTableView()
self.mainTable1.setModel(self.textFilter)
self.mainTable1.setColumnWidth(1, 150)
self.mainTable1.setColumnWidth(2, 300)
self.mainTable1.setEditTriggers(QTableView.NoEditTriggers)
self.mainTable1.setSelectionBehavior(QTableView.SelectRows)
# self.mainTable1.setContextMenuPolicy(Qt.CustomContextMenu)
self.mainTable1.doubleClicked.connect(self.Table1_DoubleClicked)
# self.mainTable1.customContextMenuRequested.connect(self.table1_CustomContextMenu)
# column auto sort
# self.mainTable1.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
# self.mainTable1.resizeColumnsToContents()
v = QVBoxLayout()
v.addWidget(self.mainTable1)
self.select_guorpbox.setLayout(v)
def Table2(self):
self.serch_groupbox = QGroupBox()
self.serch_groupbox.setTitle("Article 2")
lable = QLabel("~")
lable.setFixedWidth(10)
lable.setAlignment(Qt.AlignCenter)
insertbutton = QPushButton("insert")
self.startdate = QDateEdit()
self.startdate.setDate(QDate.currentDate())
self.startdate.setFixedWidth(150)
self.startdate.setCalendarPopup(True)
self.enddate = QDateEdit()
self.enddate.setDate(QDate.currentDate())
self.enddate.setFixedWidth(150)
self.enddate.setCalendarPopup(True)
self.article_serch_button = QPushButton("ARTICL SERTCH")
self.article_serch_button.setFixedWidth(250)
self.mainTable2_model = QStandardItemModel()
self.mainTable2 = QTableView()
self.mainTable2.setSelectionBehavior(QTableView.SelectRows)
self.mainTable2.setContextMenuPolicy(Qt.CustomContextMenu)
self.mainTable2.customContextMenuRequested.connect(self.Table2_CustomContextMenu)
h1 = QHBoxLayout()
h1.addWidget(insertbutton)
h1.addWidget(self.startdate)
h1.addWidget(lable)
h1.addWidget(self.enddate)
h1.addWidget(self.article_serch_button)
h2 = QHBoxLayout()
h2.addWidget(self.mainTable2)
v = QVBoxLayout()
v.addLayout(h1)
v.addLayout(h2)
self.modelListSave = []
self.codeSave = []
self.serch_groupbox.setLayout(v)
def Table1_DoubleClicked(self):
row = []
select_row = self.mainTable1.selectedIndexes()
for row_value in range(len(select_row)):
row.append(self.mainTable1.model().data(select_row[row_value]))
if not self.codeSave:
self.modelListSave.append(row)
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
self.codeSave.append(row[0])
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(0, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)
elif row[0] in self.codeSave:
QMessageBox.about(self, " ", "overlap.")
else:
self.modelListSave.append(row)
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
self.codeSave.append(row[0])
for k in range(5):
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(k, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)
def Table2_CustomContextMenu(self, position):
menu = QMenu()
delete = menu.addAction("delete")
action = menu.exec_(self.mainTable2.mapToGlobal(position))
indexRow = [index.row() for index in self.mainTable2.selectionModel().selectedRows()]
if delete == action:
del self.modelListSave[indexRow[0]]
self.mainTable2.model().removeRow(indexRow[0], self.mainTable2.rootIndex())
for i in range(len(self.modelListSave)):
for j in range(self.columncount):
self.mainTable2_model.setItem(i, j, QStandardItem(self.modelListSave[i][j]))
self.mainTable2.setModel(self.mainTable2_model)
for k in range(5):
spinBox = QSpinBox()
mainTable2_ModelIndex = self.mainTable2.model().index(k, 4)
self.mainTable2.setIndexWidget(mainTable2_ModelIndex, spinBox)
def Layout(self):
self.vbox = QVBoxLayout()
self.vbox.addWidget(self.SerchLineEdit)
self.vbox.addWidget(self.select_guorpbox)
self.vbox.addWidget(self.serch_groupbox)
self.setLayout(self.vbox)
if __name__ == "__main__":
app = QApplication(sys.argv)
fream = MainWindow()
fream.show()
app.exec_()
最佳答案
根据您的逻辑,您将有关复制行的信息存储在列表中,但是当您从复制表中删除行时,不要将其从该行中删除。此外,如果模型消除了某些元素,则不会通知该列表,这就是错误的原因。
相反,最好不要使用该列表,因为必须通过迭代复制表的行来完成验证。
from PyQt5 import QtCore, QtGui, QtWidgets
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
self.create_table_1()
self.create_table_2()
self.create_layout()
def create_table_1(self):
self.search_lineedit = QtWidgets.QLineEdit()
self.select_groupbox = QtWidgets.QGroupBox(title="Article 1")
self.main_table1_model = QtGui.QStandardItemModel(10, 10, self)
for i in range(self.main_table1_model.rowCount()):
for j in range(self.main_table1_model.columnCount()):
table = QtGui.QStandardItem("TEST[{},{}]".format(i,j))
self.main_table1_model.setItem(i, j, table)
table.setTextAlignment(QtCore.Qt.AlignCenter)
self.textfilter = QtCore.QSortFilterProxyModel(self, filterKeyColumn=2)
self.textfilter.setSourceModel(self.main_table1_model)
self.search_lineedit.textChanged.connect(self.textfilter.setFilterRegExp)
self.main_table1 = QtWidgets.QTableView()
self.main_table1.setModel(self.textfilter)
self.main_table1.setColumnWidth(1, 150)
self.main_table1.setColumnWidth(2, 300)
self.main_table1.setEditTriggers(QtWidgets.QTableView.NoEditTriggers)
self.main_table1.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.main_table1.doubleClicked.connect(self.on_table1_doubleClicked)
v = QtWidgets.QVBoxLayout()
v.addWidget(self.main_table1)
self.select_groupbox.setLayout(v)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_table1_doubleClicked(self, index):
row = index.row()
filters_row = self.get_items_by_row(row, self.textfilter)
for rowX in range(self.main_table2_model.rowCount()):
table_2_row = self.get_items_by_row(rowX, self.main_table2_model)
if all([item1 == item2 for item1, item2 in zip(filters_row, table_2_row)]):
QtWidgets.QMessageBox.about(self, " ", "overlap.")
return
self.main_table2_model.appendRow([QtGui.QStandardItem(text) for text in filters_row])
spinbox = QtWidgets.QSpinBox()
ix = self.main_table2_model.index(self.main_table2_model.rowCount()-1, 4)
self.main_table2.setIndexWidget(ix, spinbox)
def get_items_by_row(self, row, model):
return [model.data(model.index(row, col)) for col in range(model.columnCount())]
def create_table_2(self):
self.search_groupbox = QtWidgets.QGroupBox(title="Article 2")
label = QtWidgets.QLabel("~")
label.setFixedWidth(10)
label.setAlignment(QtCore.Qt.AlignCenter)
insertbutton = QtWidgets.QPushButton("insert")
self.startdate = QtWidgets.QDateEdit(calendarPopup=True)
self.startdate.setDate(QtCore.QDate.currentDate())
self.startdate.setFixedWidth(150)
self.enddate = QtWidgets.QDateEdit(calendarPopup=True)
self.enddate.setDate(QtCore.QDate.currentDate())
self.enddate.setFixedWidth(150)
self.article_serch_button = QtWidgets.QPushButton("ARTICL SERTCH")
self.article_serch_button.setFixedWidth(250)
self.main_table2_model = QtGui.QStandardItemModel(0, 10)
self.main_table2 = QtWidgets.QTableView()
self.main_table2.setModel(self.main_table2_model)
self.main_table2.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.main_table2.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.main_table2.customContextMenuRequested.connect(self.table2_customcontextmenu)
h1 = QtWidgets.QHBoxLayout()
h1.addWidget(insertbutton)
h1.addWidget(self.startdate)
h1.addWidget(label)
h1.addWidget(self.enddate)
h1.addWidget(self.article_serch_button)
h2 = QtWidgets.QHBoxLayout()
h2.addWidget(self.main_table2)
v = QtWidgets.QVBoxLayout()
v.addLayout(h1)
v.addLayout(h2)
self.search_groupbox.setLayout(v)
@QtCore.pyqtSlot(QtCore.QPoint)
def table2_customcontextmenu(self, position):
ix = self.main_table2.indexAt(position)
if not ix.isValid():
return
menu = QtWidgets.QMenu()
delete_action = menu.addAction("delete")
action = menu.exec_(self.main_table2.viewport().mapToGlobal(position))
if action == delete_action:
self.main_table2_model.removeRow(ix.row())
def create_layout(self):
vbox = QtWidgets.QVBoxLayout(self)
vbox.addWidget(self.search_lineedit)
vbox.addWidget(self.select_groupbox)
vbox.addWidget(self.search_groupbox)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
关于python - pyqt QStandardItemModel 有没有办法从模型中完全删除值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55254944/
我的问题是,在使用时 QStandarditemmodel::setData(const QModelIndex &index, const QVariant &value, int role) 似乎
我是 qt 的新手,我在 QTtableview 中使用 QStandardItemModel。 请建议, 如何更改行和列标题名称。目前它显示 1,2,3,4 如何让 QStandardItemMod
我有一个 QTableView ,填充了 QStandardItemModel . 我经常通过网络更新模型,模型也由用户直接通过 QTableView 更新。 . 现在我喜欢在用户更改一些数据时调用一
我喜欢制作我的 QStandardItemModel 来填充 qtreeview 中的项目将行追加到 View 中所有已定义项目的顶部。类似于 twitter View ,新项目优先。我在 QStan
为了在 QTableView 中显示一些数据,我使用一个函数来计算 QStandardItemModel 并将其发送回调用函数。 函数调用: QStandardItemModel MyModel =
QStandardItemModel::QStandardItemModel(QObject * parent = 0) Constructs a new item model with the g
标题没问题,但我只有三个空行。 永远不会调用 FileConfig::data 方法! 你知道为什么吗? model= new MyModel; model->setHeaderData(0, Qt:
我是 Qt 的初学者,我正在努力从 XML 文件填充 QStandardItemModel。 我尝试了以下操作,整个项目运行成功,但 QtableView 不显示数据。 这是我的main.cpp: v
我试过使用 Qt void QStandardItem::insertRow(int row, const QList &items)和 void QStandardItem::appendRow(c
我想做的是,我想制作一个带有可检查项目的 ListView 。我能够使用 QStandardItemModel 作为我的模型来做到这一点。现在我需要做的是添加一些需要自定义数据方法的功能。因此,正如我
我有一个包含 100,000 条数据记录的 QStandardItemModel,以及一个用于过滤和排序功能的 QSortFilterProxyModel。我想根据其中一列的值删除大量记录,比如 10
我有一个 QStandardItemModel,它显示在 q QTreeView 中。工作正常。 为了突出显示相关行,我想突出显示其中的一些行:因此我有一个 QStringList,其中包含要突出显示
如何将 BundleItem 类的项附加到 QListView 的 QStandardItem 模型?当附加它们时,我只想使用 BundleItem 的 Name 属性显示在 ListView 中。我
当分配在堆栈上的 QStandardItemModel 被销毁时,模型中的指针指向的对象会发生什么(例如 item/ item2 指针,如下例所示): QStandardItem* item = ne
有没有办法将 QStandardItemModel 复制到另一个 QStandardItemModel? 或者我必须遍历每个项目并将其附加到另一个模型? 最佳答案 一件元素只能由一个模型拥有。这就是为
目前,我想更新 QStandardItemModel 中的行项目,不会丢失相应 QTableView 中的排序顺序和行选择。 我测试了两种方法: 通过 clear() 清除模型并重新添加行会“破坏”包
我试图删除 QTableView 的所有选定索引, 现在我使用: foreach (const QModelIndex & idx, model->selectionModel()->selected
目前,我想更新 QStandardItemModel 中的行项目,不会丢失相应 QTableView 中的排序顺序和行选择。 我测试了两种方法: 通过 clear() 清除模型并重新添加行会“破坏”包
我正在创建一个应用程序,我需要使用另一个类(class)提供给我的列表来制作 list 。用户将选中他们想要的项目旁边的复选框,然后单击按钮。对于那些已检查的行,我想打印“您检查了号码 ___”。在相
我正在尝试使用 QTreeView 和 QStandardItemModel 在 PyQt4 中实现帐户结构(带有子帐户)。经过大量的试验和错误,我终于准备好了 TreeView 。现在,我希望当我单
我是一名优秀的程序员,十分优秀!