Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt.QTableView内容的单元测试_Python_Unit Testing_Pyqt_Pyqt5_Qtableview - Fatal编程技术网

Python PyQt.QTableView内容的单元测试

Python PyQt.QTableView内容的单元测试,python,unit-testing,pyqt,pyqt5,qtableview,Python,Unit Testing,Pyqt,Pyqt5,Qtableview,我的GUI(PyQt5,Python3.6)显示来自SQLite数据库的数据,主要使用qtableview 我正在使用定义的输入文件对应用程序进行单元测试,我想检查GUI中的所有内容是否都显示在正确的位置。现在,所有数据都在附加到QTableView的模型中,而不是QTableView本身。我有时使用QTableView.hideRow()隐藏原始数据中存在但不希望在此特定视图中显示的一些列 如何测试所有内容都显示在QTableView的预期位置? 下面是我想为其编写单元测试的一个小示例类: #

我的GUI(PyQt5,Python3.6)显示来自SQLite数据库的数据,主要使用qtableview

我正在使用定义的输入文件对应用程序进行单元测试,我想检查GUI中的所有内容是否都显示在正确的位置。现在,所有数据都在附加到QTableView的模型中,而不是QTableView本身。我有时使用
QTableView.hideRow()
隐藏原始数据中存在但不希望在此特定视图中显示的一些列

如何测试所有内容都显示在QTableView的预期位置?

下面是我想为其编写单元测试的一个小示例类:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from PyQt5 import QtSql
from PyQt5.QtWidgets import (QWidget, QTableView, QApplication, QHBoxLayout)
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(400, 150)

        self.createConnection()
        self.fillTable()
        self.createModel()
        self.initUI()

    def createConnection(self):
        self.db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("test.db")
        if not self.db.open():
            print("Cannot establish a database connection")
            return False

    def fillTable(self):
        self.db.transaction()
        q = QtSql.QSqlQuery()

        q.exec_("DROP TABLE IF EXISTS Cars;")
        q.exec_("CREATE TABLE Cars (Company TEXT, Model TEXT, Year NUMBER);")
        q.exec_("INSERT INTO Cars VALUES ('Honda', 'Civic', 2009);")
        q.exec_("INSERT INTO Cars VALUES ('VW', 'Golf', 2013);")
        q.exec_("INSERT INTO Cars VALUES ('VW', 'Polo', 1999);")

        self.db.commit()

    def createModel(self):
        self.model = QtSql.QSqlTableModel()
        self.model.setTable("Cars")
        self.model.select()

    def initUI(self):
        layout = QHBoxLayout()
        self.setLayout(layout)

        view = QTableView()
        layout.addWidget(view)

        view.setModel(self.model)
        view.hideRow(1)

    def closeEvent(self, e):
        if (self.db.open()):
            self.db.close()


def main():
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
当然,我可以测试模型中的数据:

self.assertEqual(model.headerData(0, Qt.Horizontal, Qt.DisplayRole), "Company")
self.assertEqual(model.data(model.index(0, 0), Qt.DisplayRole), "Honda")
等等

但是模型包含3行,而我的QTableView只有2行(因为大众高尔夫的行是隐藏的)


那么,有没有办法测试QTableView中显示的数据而不是模型中的数据?(在示例类中,我希望测试断言视图仅包含2行,Polo行是第二行。)

如果要验证任何索引是否可见,这并不取决于模型,因为模型是数据的表示形式,例如,一个模型可以由多个视图共享,因此每个视图选择要显示的项目,要知道哪个索引在
QTableView
中可见,必须使用
isIndexHidden()
方法:

from PyQt5 import QtCore, QtWidgets, QtSql
import sys

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        ...

    def initUI(self):
        layout = QtWidgets.QHBoxLayout()
        self.setLayout(layout)

        self.view = QtWidgets.QTableView()
        layout.addWidget(self.view)

        self.view.setModel(self.model)
        self.view.hideRow(1)
        self.items_visible()

    def items_visible(self):
        for i in range(self.model.rowCount()):
            for j in range(self.model.columnCount()):
                ix = self.model.index(i, j)
                if not self.view.isIndexHidden(ix):
                    print("{}-{}: {}".format(ix.row(), ix.column(), ix.data()))


def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

检查Polo行是否显示在第二行如何?由于视图中的行号和模型中的行号不一样,我发现这很困难。正如模型所示,一个模型可以被多个视图共享,因此在某些视图中可以过滤某些列,在其他视图中隐藏某些行,等等,因此visualindex不必与模型的索引匹配。[cont]例如,visualindex有点模糊,假设您有100行,但没有使用hideRow(),因此可以说所有行都是可见的,但由于有许多行,scrollvar会使一些行对视图隐藏,因此为了避免混淆和浪费时间,您如何定义一行是可见的,这就是为什么我想测试视图本身的数据,因为每个视图都显示一组定义好的行,所以应该可以从那里开始计数。但是如果这不可能,我将不得不通过测试所有(并且只有)非隐藏行都没有隐藏,并且非隐藏行的内容是可以的。看起来很难看,但可行。感谢指向isIndexHidden的指针。显示的索引的性能不是由性能保存的,您不认为保存visualIndex会导致不必要的内存消耗吗?我已经在Qt工作了几年,我从来没有需要获取visualIndex,因此,我认为这是没有必要的,这将只是一个内存开销。