我正在使用QTestLib框架在QTableView中为自定义Validator编写单元测试.最基本的测试用例之一可以这样描述:
双击第三列和第四行中的表格单元格,并在其内容中附加数字"5".
仅仅改变模型中的值或任何东西是不够的,测试用例应该像这样执行:
注意:这个问题有一个关于如何从代码中将表格单元格设置为编辑模式的答案,但是单元测试应该尝试坚持人类用户的可能性,即鼠标/键盘操作.
我发现可以使用QTableView :: columnViewportPosition(int)和QTableView :: rowViewportPosition(int)检索单元格的X/Y位置.但是,使用QTest :: mouseDClick(...)双击指定位置既不选择单元格也不将其设置为编辑模式:
// Retrieve X/Y coordinates of the cell in the third column and the fourth row
int xPos = m_pTableView->columnViewportPosition( 2 );
int yPos = m_pTableView->rowViewportPosition( 3 );
// This does not work
QTest::mouseDClick( m_pTableView, Qt::LeftButton, QPoint( xPos, yPos ) );
Run Code Online (Sandbox Code Playgroud)
如何使用鼠标/键盘操作实现上述测试用例?
PS:我在Windows XP 32位和Qt 4.6.1下尝试这个
我有一个 QTableView 以网格的形式显示数据库的一些信息。其中一个字段是图像的路径,我想在我的表格中显示这些图像。
我与代表一起尝试了一些东西,但我对他们不太满意,而且我什么也做不了。我也尝试了一些角色:
if index.column() == 4:
if role == QtCore.Qt.DecorationRole:
label = QtGui.QLabel()
path = "path/to/my/picture.jpg"
image = QtGui.QImage(str(path))
pixmap = QtGui.QPixmap.fromImage(image)
label.setPixmap(pixmap)
return label
Run Code Online (Sandbox Code Playgroud)
这段代码的灵感来自我在另一个论坛上发现的应该可以工作的东西。但是它对我没有任何作用,只会减慢我的代码的执行速度。
知道为什么它不起作用吗?如果你有一个代表的例子,我也会很感激!
感谢您的关注
已解决:我让它与自定义委托一起工作。如果有人感兴趣,这是我的代码:
class ImageDelegate(QtGui.QStyledItemDelegate):
def __init__(self, parent):
QtGui.QStyledItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
painter.fillRect(option.rect, QtGui.QColor(191,222,185))
# path = "path\to\my\image.jpg"
path = "araignee_de_mer.jpg"
image = QtGui.QImage(str(path))
pixmap = QtGui.QPixmap.fromImage(image)
pixmap.scaled(50, 40, QtCore.Qt.KeepAspectRatio)
painter.drawPixmap(option.rect, pixmap)
Run Code Online (Sandbox Code Playgroud) 我有一个 Python 和 PySide 应用程序,它连接到 mysql 数据库并在 QTableView 中显示查询结果。我需要打印表格视图的内容。这是一些代码:
self.db_table = QtGui.QTableView(self)
self.model = QtSql.QSqlQueryModel()
self.model.setQuery("SELECT * FROM simpsons")
self.model.setHeaderData(1, QtCore.Qt.Horizontal, self.tr("First Name"))
self.model.setHeaderData(2, QtCore.Qt.Horizontal, self.tr("Last Name"))
self.db_table.setModel(self.model)
self.print_btn = QtGui.QPushButton("Print")
self.print_btn.clicked.connect(self.print_btn_clicked)
def print_btn_clicked(self):
printDialog = QtGui.QPrintDialog(self.printer, self)
if printDialog.exec_() == QtGui.QDialog.Accepted:
#printing code
Run Code Online (Sandbox Code Playgroud)
我找不到这方面的例子,我对文档了解不多,所以我很感激一些帮助
我有这个带有自定义模型和委托的 QTableView,编辑后如何更改单元格的背景颜色?
我应该在代表处这样做setModelData()吗?
index.model.setData(index, QVariant(True),Qt.UserRole)
Run Code Online (Sandbox Code Playgroud)
后来在模型的data()# 它自称?
if role == Qt.BackgroundColorRole:
if index.model().data(index,Qt.UserRole).toBool():
return QVariant(QColor(Qt.darkBlue))
Run Code Online (Sandbox Code Playgroud)
在模型中,setData()我没有任何代码,例如:
if role==Qt.UserRole:
....
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
编辑:这是我setData()在自定义模型中的整个方法
def setData(self, index, value, role=Qt.EditRole):
if index.isValid() and 0 <= index.row() < len(self.particles):
particle = self.particles[index.row()]
column = index.column()
if column == ID:
value,ok= value.toInt()
if ok:
particle.id =value
elif column == CYCLEIDANDNAME:
cycleId,cycleName= value.toString().split(' ')
particle.cycleId =cycleId
# also need to set cycleName
for name in self.cycleNames:
if name.endsWith(cycleName):
particle.cycleFrameNormalized=particle.cycleName …Run Code Online (Sandbox Code Playgroud) 此代码创建单个QTableView. 单击该列将显示指示列排序方向的箭头。单击 tableView 的项目本身会打印出单击的索引。单击 tableView 项时,我想知道三列(标题)中的哪一列是当前的(显示箭头的列)以及排序箭头指向的方向:向上或向下。如何实现这一目标?
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class Model(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]
def rowCount(self, parent=QtCore.QModelIndex()):
return 3
def columnCount(self, parent=QtCore.QModelIndex()):
return 3
def data(self, index, role):
if not index.isValid(): return
if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
return self.items[index.row()][index.column()]
def onClick(index):
print 'clicked index: %s'%index
def sortIndicatorChanged(column=None, sortOrder=None):
print 'sortIndicatorChanged: column: %s, sortOrder: %s'%(column, sortOrder)
tableModel=Model()
tableView=QtGui.QTableView()
tableView.setModel(tableModel)
tableView.setSortingEnabled(True)
tableView.clicked.connect(onClick)
tableView.horizontalHeader().sortIndicatorChanged.connect(sortIndicatorChanged)
tableView.show() …Run Code Online (Sandbox Code Playgroud) 我有一个使用 QTableView 和 QListView 的 Qt 应用程序。在两个witdgets 中我都显示了一些图标。
问题是,当用户选择其中一个条目时,Qt alpha 会混合图标上的选择,从而使图标显示的对比度较低且颜色略有不同。
我希望 Qt 首先绘制选区,然后在顶部绘制图标,这样无论是否选择它们,它们看起来都一样。我怎样才能做到这一点?
更新:
这就是我的问题:
使用白色矩形图标更容易识别:
当您使用图形编辑器检查颜色值时,您会看到颜色值发生变化。我希望 Qt 在没有此覆盖的情况下按原样绘制图标。
这里的 QListView 采用颜色渐变背景样式。但我对无样式的 QTableView 也有同样的问题。
顺便说一句,所有图标都是 SVG。
我有一个QTableView隐藏的水平标题
table->horizontalHeader()->hide();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,由于列宽,中间列中的文本被剪裁。
要查看文本,用户需要调整列的大小,但如果没有标题,我无法执行此操作。
我希望能够做的是将鼠标悬停在列的边缘上并显示正常的调整大小图标,然后允许用户将列拖得更宽。
这可能吗?
我创建了一个基于 QAbstractTableModel 的模型,允许用户编辑该模型中的数据。该模型显示在 QMainWindow 中的 QTableView 中。到目前为止,在我的模型中,我能够使单元格可编辑,并在编辑完成后保存用户输入的任何内容。
问题是当用户开始编辑时,它会“清除”该单元格的先前内容。因此,例如,如果我只想更改单元格中字符串的拼写,则必须重新键入整个值。我希望在编辑时编辑器将从模型中已有的数据开始,而不是空的。
我怎样才能做到这一点?
问题示例:
在我开始编辑单元格之前:
我一开始编辑,单元格就是空的。我希望它以模型中已有的先前值作为星标:
这是我的模型的最小示例。我的实际模型要大得多,并且使用结构而不是 QVariants 的二维数组来存储数据。
标题:
const int COLS= 2;
const int ROWS= 6;
class EditableTableModel : public QAbstractTableModel
{
Q_OBJECT
private:
QVariant tableData[ROWS][COLS];
public:
EditableTableModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QVariant headerData(int section, …Run Code Online (Sandbox Code Playgroud) 我(只是)希望能够使用QTableView拖放机制来移动现有行。我找到了很多资源(例如,这里,这里或这里),它们描述了拖放,插入等的某些方面,但我仍在努力使其适合我的情况。
这是我正在寻找的解决方案应该具备的功能:
本教程展示了一个非常接近我需要的解决方案,但它使用了一个QStandardItemModel而不是QAbstractTableModel对我来说看起来半优化的解决方案,因为我必须基于(我是对的吗?)QStandardItem需要的“镜像”数据结构进行操作。QStandardItemModel
下面附加了代表我当前进度的代码。
目前我看到两种可能的方法:
方法 1:实现QAbstractTableModel并实现所有需要的事件/槽以修改底层数据结构: * 优点:最通用的方法 * 优点:没有冗余数据 * 缺点:我不知道如何获知已完成的拖放操作以及什么索引移到了哪里
在我附加的代码中,我跟踪了我所知道的所有相关方法并打印出所有参数。这是将第 2 行拖到第 3 行时得到的结果
dropMimeData(data: ['application/x-qabstractitemmodeldatalist'], action: 2, row: -1, col: -1, parent: '(row: 2, column: 0, valid: True)')
insertRows(row=-1, count=1, parent=(row: 2, column: 0, valid: True))
setData(index=(row: 0, column: 0, valid: True), value='^line1', role=0)
setData(index=(row: 0, column: …Run Code Online (Sandbox Code Playgroud) qtableview ×10
qt ×6
python ×4
pyqt ×3
c++ ×2
qt5 ×2
image ×1
printing ×1
pyside ×1
python-3.x ×1
qheaderview ×1
qlistview ×1
qscrollarea ×1
qt4 ×1
qt4.6 ×1
qtestlib ×1