- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
QTableView
由QAbstractTableModel
控制。它是填充其内容的模型。模型修改了 self.items
变量,结果是用户双击了 QTableView
的一个项目,然后输入了一个新的值(value)。
对话框底部的按钮最初是禁用的。我希望此按钮在用户输入新值后立即启用(通过双击 QTableView
的任何一项并键入字符串或数字)。
本质上,我希望模型能够控制按钮的状态。我怎样才能实现它?
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items =[
['Row0_Column0','Row0_Column1','Row0_Column2'],
['Row1_Column0','Row1_Column1','Row1_Column2'],
['Row2_Column0','Row2_Column1','Row2_Column2']
]
def flags(self, index):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
def rowCount(self, parent):
return len(self.items)
def columnCount(self, parent):
return 3
def data(self, index, role):
if not index.isValid(): return QVariant()
row=index.row()
column=index.column()
if row>len(self.items): return QVariant()
if column>len(self.items[row]): return QVariant()
if role == Qt.EditRole:
return QVariant(self.items[row][column])
if role == Qt.DisplayRole:
return QVariant(self.items[row][column])
return QVariant()
def setData(self, index, value, role=Qt.EditRole):
if index.isValid():
if role == Qt.EditRole:
row = index.row()
column=index.column()
if row>len(self.items) or column>len(self.items[row]):
return False
else:
self.items[row][column]=value
return True
return False
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
tablemodel=Model(self)
tableview=QTableView(self)
tableview.setModel(tablemodel)
layout=QVBoxLayout(self)
layout.addWidget(tableview)
self.button=QPushButton('Push Me')
self.button.setDisabled(True)
layout.addWidget(self.button)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
最佳答案
Martin 的评论已经是一个很好的起点,但在您的自定义模型中,您还必须在 setData 方法中发出 dataChanged 信号才能使其工作。
然后您还可以定义自己的自定义信号并发射它们并为它们连接。但是,这是您使用 QAbstractItemModel 的 dataChanged 信号的示例:
from PySide import QtGui, QtCore
class Model(QtCore.QAbstractTableModel):
def __init__(self, parent=None, *args):
QtCore.QAbstractTableModel.__init__(self, parent, *args)
self.items =[
['Row0_Column0','Row0_Column1','Row0_Column2'],
['Row1_Column0','Row1_Column1','Row1_Column2'],
['Row2_Column0','Row2_Column1','Row2_Column2']
]
def flags(self, index):
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def rowCount(self, parent):
return len(self.items)
def columnCount(self, parent):
return 3
def data(self, index, role):
if not index.isValid():
return None
row=index.row()
column=index.column()
if row > len(self.items):
return None
if column > len(self.items[row]):
return None
if role == QtCore.Qt.EditRole:
return self.items[row][column]
if role == QtCore.Qt.DisplayRole:
return self.items[row][column]
return None
def setData(self, index, value, role=QtCore.Qt.EditRole):
if index.isValid():
if role == QtCore.Qt.EditRole:
row = index.row()
column = index.column()
if row > len(self.items) or column > len(self.items[row]):
return False
else:
self.items[row][column] = value
self.dataChanged.emit(index, index) # emit the signal
return True
return False
class MyWindow(QtGui.QWidget):
def __init__(self, *args):
QtGui.QWidget.__init__(self, *args)
tablemodel = Model(self)
tablemodel.dataChanged.connect(self.data_changed) # connect dataChanged signal
tableview = QtGui.QTableView(self)
tableview.setModel(tablemodel)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(tableview)
self.button = QtGui.QPushButton('Push Me')
self.button.setDisabled(True) # initially disabled
layout.addWidget(self.button)
self.setLayout(layout)
def data_changed(self, topleft_index, bottom_right_index):
# just enable the button
self.button.setEnabled(True)
app = QtGui.QApplication([])
w = MyWindow()
w.show()
app.exec_()
注释行是重要的。
关于python - 如何使用 QAbstractTableModel 模型控制其他小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28092837/
试图更多地了解 QAbstractTableModel,我遇到了 rowCount 和 columnCount 的虚拟方法,这些方法在继承 QAbstractTableModel 时需要实现。 拿 i
出于测试目的,有一个函数要求输入并将其显示在 QListView 中。 display data . 这适用于一个 dim.data 我想扩展脚本显示二维数据 传入的数据应该插入第一行直到第 3 列,
最近又拿起了Qt,开始刷新内存了。为表创建自定义数据模型非常简单。 现在我正在尝试检索选定的数据。请注意,我使用自定义数据对象。 我的自定义模型示例: 平台.h class Platform { pu
如何使 QAbstractTableModel 的数据可检查 我想让下面代码中的每个单元格都可以被用户选中或取消选中,如何修改代码? 根据Qt文档:Qt::CheckStateRole和设置Qt::I
我用通常的方式实现了 QAbstractTableModel: class PrintIntervalTableModel : public QAbstractTableModel { private
我需要用 Qt 实现一个表。 我相信我会起诉一个 QAbstractTableModel,一个 QTableView 使用这个模型。 我知道我必须编辑模型的 rowCount()、columnCoun
我正在尝试显示来自 QAbstractTableModel 的图像。我尝试返回一个QPixmap作为data()的QVariant,但它只产生空单元格,而我期望第二个单元格中的每个单元格列有一个 20
我有一个使用 Q_GLOBAL_STATIC 实现的单例类,它包含一个必须从多个线程访问的数据结构,我在类中实现了访问器函数,它会在访问数据之前锁定互斥量,这样所有对共享数据的访问都是序列化的。 问题
我目前正在尝试制作一个基于QTableView 的vie。因此,我使用 QAbstractTableModel 来存储数据。我的问题是,一旦我从 QVariant headerData(int sec
我有一个子类 class TableModel : public QAbstractTableModel 我重写了 headerData 方法如下: QVariant TableModel::head
我从 QAbstractTableModel 派生了一个模型,现在我想通知一整行的数据已被更改。例如,如果更改了索引为 5 的行的数据(4 列),则使用以下代码将按预期工作。 emit dataCha
我有一个 PyQt QTableView,连接到一个 QAbstractTableModel,它本身连接到一个管理项目列表的自定义类。我可以在列表末尾插入一个项目,它会适本地通知我的模型,然后调用 b
我发现了这个问题:How to change the background color for a QTreeView Header (aka QHeaderView)? 我希望能够为每个标题部分设置
我创建了一个名为 tableModel 的 QAbstractTableModel 模型和一个名为 listModel 的 QAbstractListModel 模型,并将这些模型设置为各自的 Vie
我需要一个能够快速添加和显示大约 100'000 个项目的表格 GUI 控件。出于这个原因,需要“虚拟”表控件,它只加载和显示可见的项目。我尝试了 QTableView 和 QAbstractTabl
QTableView 由QAbstractTableModel 控制。它是填充其内容的模型。模型修改了 self.items 变量,结果是用户双击了 QTableView 的一个项目,然后输入了一个新
这是我在这里的第一篇文章,但自从我开始编程以来,我得到了你们所有人的很多帮助。 我是 Qt 的新手,目前正在尝试制作我的第一个项目。我的问题是关于模型、底层数据和 View 之间的通信。 我首先将后台
在我的应用程序中,我有一个用于保存项目列表的类: class Database : public QObject { Q_OBJECT public: Database(QObject
Qt.AlignRight 右对齐文本但将其放在右上角。 Qt.AlignRight | Qt.AlignVCenter 不起作用。将其放入左上角。 有没有办法让文本同时保持垂直居中和右对齐? 代码示
我有自己的表格模型 (DragDropTableModel),它是 QAbstractTableModel 的子类。在它里面,我希望最后一行始终保持空白。 我通过将 insertRows() 添加到
我是一名优秀的程序员,十分优秀!