我有QTableView
和QAbstractTableModel
.我要求行的高度等于24.我知道这样做的唯一方法是通过调用QTableView::setRowHeight
.由于模型是动态的,因此可能会添加新行,但setRowHeight
每次添加新行时我都不想调用.
如何配置QTableView
以使其对新添加的行使用相同的高度,或者可以将模型发送到行的高度?
我们正在使用QTableView
Qt 4.6.3,并且需要一个在每个单元格中只有一个复选框的列.我们使用自定义子类QAbstractTableModel
作为模型QTableView
.现在,我们通过设置Qt::ItemIsUserCheckable
标志有一个复选框.但我们无法弄清楚如何摆脱复选框旁边的空白文本框!
我们怎样才能使列只有一个复选框,没有别的?
我需要用Qt实现一个表.
我相信我会使用这个模型使用QTableView来起诉QAbstractTableModel.
我知道我必须编辑模型的rowCount(),columnCount()和data()函数.
但是,我不明白如何在模型中精确设置数据,以便data()函数可以检索它.
为此目的提供了setData()函数吗?我已经看到它需要EditRole作为其参数,我不想要,因为我不希望我的表可编辑.
那么,如何使用data()函数在模型中"设置"数据,或者让模型获得数据?
另外,如何调用data()函数,即谁调用它以及需要调用它的位置?
请帮我解决一下这个.
谢谢.
我一直在努力解决这个问题,我似乎无法找到正确的方法.
我想要的是能够使用动画图标作为我的一些项目的装饰(通常表明该特定项目正在进行一些处理).我有一个自定义表模型,我在一个显示QTableView
.
我的第一个想法是创建一个自定义委托,负责显示动画.当传递a QMovie
作为装饰角色时,代表将连接到QMovie
每个新框架可用时更新显示(参见下面的代码).但是,在调用委托paint
方法后,画家似乎仍然无效(调用画家save
方法时出错,可能是因为指针不再指向有效内存).
另一种解决方案是dataChanged
每当新帧可用时发出项目的信号,但1)会产生许多不必要的开销,因为数据没有真正改变; 2)在模型级别处理电影似乎并不干净:显示层(QTableView
或代理人)应负责处理新帧的显示.
有没有人知道在Qt视图中显示动画的干净(并且最好是高效)方式?
对于那些感兴趣的人,这里是我开发的代表的代码(目前不起作用).
// Class that paints movie frames every time they change, using the painter
// and style options provided
class MoviePainter : public QObject
{
Q_OBJECT
public: // member functions
MoviePainter( QMovie * movie,
QPainter * painter,
const QStyleOptionViewItem & option );
public slots:
void paint( ) const;
private: // member variables
QMovie * movie_;
QPainter * painter_;
QStyleOptionViewItem option_; …
Run Code Online (Sandbox Code Playgroud) 我是Qt编程的新手.我正在尝试创建一个可以通过单击按钮添加行的简单表.我可以很好地实现表,但似乎无法获得更新的数据显示在表上.我相信我的问题源于这样一个事实:我似乎无法使用按钮正确调用任何类型的"更改数据"方法.我已经尝试了几种不同的在线解决方案,所有这些都导致了4年前的死胡同.到目前为止我所拥有的是基本结构,我无法弄清楚如何使用新数据更新表.
这是基本观点
我已经设置了一些测试数据.
在最后的实现中,表将从空开始,我想追加行并将它们显示在表视图中.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
# create table
self.get_table_data()
self.table = self.createTable()
# layout
self.layout = QVBoxLayout()
self.testButton = QPushButton("test")
self.connect(self.testButton, SIGNAL("released()"), self.test)
self.layout.addWidget(self.testButton)
self.layout.addWidget(self.table)
self.setLayout(self.layout)
def get_table_data(self):
self.tabledata = [[1234567890,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20]]
def createTable(self):
# create the view
tv = QTableView()
# set the table model
header = ['col_0', 'col_1', 'col_2', 'col_3', 'col_4']
tablemodel = MyTableModel(self.tabledata, header, self)
tv.setModel(tablemodel)
# set the minimum size …
Run Code Online (Sandbox Code Playgroud) 以下是我目前正在尝试的内容.标题文本正确更改颜色,但背景不会更改默认值.
template<typename T>
inline QVariant TableModel<T>::headerData(int section, Qt::Orientation orientation, int role) const
{
//...
else if(role == Qt::BackgroundRole) {
return QBrush(m_display.headerBackground);
}
//...
}
Run Code Online (Sandbox Code Playgroud)
如何设置背景颜色?
我已经将QAbstractTableModel子类化并覆盖了flags()方法,因此某些表格单元格是可编辑的.问题是当我开始编辑时,现有的单元格值被删除.我想最初选择现有的单元格值.我怎样才能做到这一点?
我正在尝试在PyQt中创建一个可编辑的表.这是仅显示表格的代码:
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *
# données à représenter
my_array = [['00','01','02'],
['10','11','12'],
['20','21','22']]
def main():
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
# création de la vue et du conteneur
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
tablemodel = MyTableModel(my_array, self)
tableview = QTableView()
tableview.setModel(tablemodel)
layout = QVBoxLayout(self)
layout.addWidget(tableview)
self.setLayout(layout)
# création du modèle
class MyTableModel(QAbstractTableModel):
def __init__(self, datain, parent = None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.arraydata …
Run Code Online (Sandbox Code Playgroud) 我想在单击delete
按钮时从表中删除选定的行.
但我找不到有关删除Qt文档中的行的任何内容.有任何想法吗?
以下是我添加的行类.它是由代码而不是表调用的,我希望它在添加新行时正确调用dataChanged,虽然这不起作用,但表没有做任何事情.我究竟做错了什么?
void MyModel::add(const Person& p)
{
people.push_back(p);
QModelIndex top = createIndex(people.count() - 1, 0, 0);
QModelIndex bottom = createIndex(people.count() - 1, 3, 0);
emit dataChanged(top, bottom); // emit layoutChanged() if headers changed
}
Run Code Online (Sandbox Code Playgroud)