表格类型对象
针对Qt中的表格和单元格提供的对象,CukeTest提供了Table
和TableItem
两个控件。并且围绕了表格相关的控件提供了操作表格数据的API,无论是获取、编辑能够满足。类型文件如下:
针对表格控件还提供了相应的演练——演练:操作Qt应用中的Table,能够大大加深对于API的理解程度。
表格控件: Table
用于描述表格视图控件的对象类型——Table
,由于是Qt的一种视图组件,能够改变排序之类的显示效果,作为一种单元格的复合容器而存在的。
类型文件定义
export interface IQTable extends IQtControl {
getItem(rowIndex: number, columnInndex: number): IQTableItem;
findItem(text: string): Promise<IQTableItem | null>;
select(rowIndex, columnIndex: number): Promise<QTableItem>;
scrollToTop(): Promise<void>;
scrollTo(rowIndex: number, columnIndex:number): Promise<IQTableItem>;
scrollToBottom(): Promise<void>;
cellValue(rowIndex: number, columnNameOrIndex: number | String): Promise<string>;
setCellValue(rowIndex: number, columnNameOrIndex: number | String, value: String): Promise<void>;
columnHeaders(): Promise<string[]>;
data(): Promise<string[][]>;
rowData(rowIndex: number): Promise<string[]>
rowCount(): Promise<number>;
columnCount(): Promise<number>;
}
class QTable(QtControl):
def columnHeaders() -> List[str]
def cellValue(rowIndex: int, columnNameOrIndex: Union[str, int]) -> str
def setCellValue(rowIndex: int, columnNameOrIndex: Union[str, int], value: str) -> None
def data() -> List[List[str]]
def getItem(rowIndex: int, columnIndex: int) -> "QTableItem"
def findItem(text: str, options: Optional[FindItemOptional]=None) -> "QTableItem"
def rowData(rowIndex: int) -> List[str]
def select(rowIndex: int, columnIndex: int) -> "QTableItem"
def rowCount() -> int
def columnCount() -> int
def scrollToTop() -> None
def scrollTo(rowIndex: int, columnIndex: int) -> "QTableItem"
def scrollToBottom() -> None
getItem(rowIndex, colIndex): TableItem
获取指定行列位置的单元格对象。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - colIndex:
number
类型,代表目标单元格的列位置索引,从0开始计算位置; - 返回值:
TableItem
类型,即目标单元格控件类型的自动化对象,如果行列位置对应的单元格无效的话,在调用后会出现1003: ObjectNotExist
的错误。
findItem(text: string, options?:object): Promise<IQTableItem | null>
根据名称搜索目标单元格,返回目标单元格的自动化对象TableItem
,默认采取模糊搜索,不区分大小写,返回部分匹配的第一个结果,如果没有搜索到则返回null
。
虽然采取模糊匹配,但是如果有完全匹配的结果,则会最优先返回,无论是作为第几个结果。
- text:
string
类型,期望目标列表项的内容或者文本;- options: (可选)搜索选项。
- exact: 精确匹配选项,
boolean
类型,默认为false
。设为true
后会从模糊搜索改为精确搜索,只返回完全匹配的第一个结果,否则返回null
。- 返回值:
Promise<IQTableItem>
或Promise<null>
类型,异步的搜索应用中的目标单元格,如果没有搜索到则返回null
。
select(rowIndex, colIndex): Promise<TableItem>
点击选中并返回指定行列位置的单元格对象。这里的选中只保证会触发单元格的聚焦事件,不一定能完全等效于点击单元格,因此有些事件不一定发生(比如选中单元格内的复选框)。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - colIndex:
number
类型,代表目标单元格的列位置索引,从0开始计算位置; - 返回值:
Promise<TableItem>
类型,即目标单元格控件类型的自动化对象,如果行列位置对应的单元格无效的话,在调用后会出现1006: OutOfRange
的错误。
scrollToTop(): Promise<void>
滚动到表格顶部。
- 返回值: 不返回任何值的异步方法。
scrollTo(rowIndex, colIndex): Promise<TableItem>
滚动到目标索引位置,并返回该对象。如果目标位置还未加载,会一直加载到目标索引位置加载为止。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - colIndex:
number
类型,代表目标单元格的列位置索引,从0开始计算位置; - 返回值:
Promise<TableItem>
,即异步的返回目标位置的单元格对象。
scrollToBottom(): Promise<void>
滚动到表格底部。
- 返回值: 不返回任何值的异步方法。
setCellValue(rowIndex, columnNameOrIndex, value): Promise<void>
编辑目标行列单元格的值,列位置也可以传入字符串,如果这么做,则会在表头中寻找相应的列位置。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - colNameOrIndex:
number
类型或者string
类型,代表目标单元格的列位置索引,从0开始计算位置;也可以传入表头中目标列的名字,比如"Name"、'ID"之类的。 - value:
string
类型,期望的单元格值。 - 返回值: 不返回任何值的异步方法。如果行列位置超出,或者传入的列名不存在,则会抛出
1006: OutOfRange
。
cellValue(rowIndex, columnNameOrIndex): Promise<string>
获取目标行列单元格的值,可以理解为setCellValue()
方法相对的Getter
方法。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - colNameOrIndex:
number
类型或者string
类型,代表目标单元格的列位置索引,从0开始计算位置;也可以传入表头中目标列的名字,比如"Name"、'ID"之类的。 - 返回值:
Promise<string>
类型,异步的返回string
类型的结果,无论目标单元格内是什么内容。如果行列位置超出,或者传入的列名不存在,则会抛出1006: OutOfRange
。
columnHeaders(): Promise<string[]>
获取表头的内容,并以字符串数组的形式返回。
- 返回值:
Promise<string[]>
类型,异步的返回string
类型的数组,无论表头中是什么内容。
data(): Promise<string[][]>
获取表格中的所有内容,并以二维数组的形式返回。
- 返回值:
Promise<string[][]>
类型,即二维的字符串数组。
假如表格数据如下:
学号 | 姓名 | 性别 |
---|---|---|
0001 | 小王 | 男 |
0002 | 小明 | 男 |
0003 | 小红 | 女 |
那么data()
方法返回的数组如下:
[
['0001', '小王', '男'],
['0002', '小明', '男'],
['0003', '小红', '女']
]
rowData(rowIndex): Promise<string[]>
获取目标行的数据,以字符串数组形式返回。
- rowIndex:
number
类型,代表目标单元格的行位置索引,从0开始计算位置; - 返回值:
Promise<string[]>
类型,异步的返回string
类型的数组,无论目标单元格内是什么内容。如果行列位置超出,或者传入的列名不存在,则会抛出1006: OutOfRange
。
rowCount(): Promise<number>
获取表的行数。如果表格含有未被加载的部分,则只会计算已加载的行数。
- 返回值:
Promise<number>
,异步的返回number
类型的结果。
columnCount(): Promise<number>
获取表的列数,值与columnHeaders()
方法返回的数组长度一致。
- 返回值:
Promise<number>
,异步的返回number
类型的结果。
单元格控件: TableItem
针对单元格控件的定义和方法。
类型文件定义
export interface IQTableItem extends IQtControl {
select(): Promise<void>;
scrollIntoView(): Promise<void>;
set(value: String): Promise<void>;
toggleCheck(checkState: boolean | 'partial'): Promise<void>;
data(roleId?:number): Promise<string|int>;
value(): Promise<string>;
editable(): Promise<boolean>;
selected(): Promise<boolean>;
rowIndex(): Promise<number>;
columnIndex(): Promise<number>;
checkState(): Promise<boolean | 'partial'>;
}
class QTableItem(QItemViewItem):
def value() -> str
def select() -> None
def scrollIntoView() -> None
def set(value: str) -> None
def data(roleId: int = None) -> Union[str, int]
def rowIndex() -> int
def columnIndex() -> int
def checkState() -> bool
def toggleCheck(checkState: bool) -> None
对象操作API
下面是TableItem
控件的对象方法。
select(): Promise<void>
选中目标单元格。
- 返回值: 不返回任何值的异步方法。
scrollIntoView(): Promise<void>
滚动到目标单元格位置。
- 返回值: 不返回任何值的异步方法。
set(value): Promise<void>
直接修改单元格的值。
- value:
string
类型,期望的单元格值。 - 返回值: 不返回任何值的异步方法。
toggleCheck(checkState: boolean | 'partial'): Promise<void>
选中或是取消选中单元格中的复选框。
- checkState:
boolean
类型或是partial
字符串。true
代表选中,false
代表未选中,"partial"
代表部分选中(常见于含子选项的复选框)。 - 返回值: 不返回任何值的异步方法。
data(roleId?:number): Promise<string|int>
传入role,返回单元格数据内容,不传使用缺省role=DisplayRole
- 返回值:
string
类型或是int
类型数据内容。
role值可参考enum Qt::ItemDataRole
获取单元格的文本数据内容:
const { RunSettings } = require("leanpro.common");
const { QtAuto } = require("leanpro.qt");
(async () => {
await RunSettings.set({slowMo: 1000, reportSteps: true});
let modelQt = QtAuto.loadModel(__dirname + "/recording.tmodel");
//启动Qt应用文件"dockwidgets"
await QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin/dockwidgets.exe");
//等待Qt应用"dockwidgets"
await modelQt.getApplication("dockwidgets").exists(10);
const role = 0
//点击 "34"
console.log(await modelQt.getTableItem("34").data(role))
//点击 "58"
console.log(await modelQt.getTableItem("58").data(role))
//点击 "81"
console.log(await modelQt.getTableItem("81").data(role))
//点击 "42"
console.log(await modelQt.getTableItem("42").data(role))
//点击 "2"
console.log(await modelQt.getTableItem("2").data(role))
//close Window "Dock_Widgets"
await modelQt.getWindow("Dock_Widgets").close();
//关闭Qt应用"dockwidgets"
await modelQt.getApplication("dockwidgets").quit();
})();
import os
from leanproAuto import RunSettings, QtAuto
RunSettings.set({"slowMo": 1000, "reportSteps": True})
modelQt = QtAuto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/recording_2.tmodel")
#启动Qt应用文件"dockwidgets"
QtAuto.launchQtProcessAsync("C:\\Program Files\\LeanPro\\CukeTest\\bin\\dockwidgets.exe")
#等待Qt应用"dockwidgets"
modelQt.getApplication("dockwidgets").exists(10)
role = 0
#点击 "34"
print(modelQt.getTableItem("34").data(role))
#点击 "58"
print(modelQt.getTableItem("58").data(role))
#点击 "81"
print(modelQt.getTableItem("81").data(role))
#点击 "42"
print(modelQt.getTableItem("42").data(role))
#点击 "2"
print(modelQt.getTableItem("2").data(role))
#close Window "Dock_Widgets"
modelQt.getWindow("Dock_Widgets").close()
#关闭Qt应用"dockwidgets"
modelQt.getApplication("dockwidgets").quit()
value(): Promise<string>
获取单元格的值。
- 返回值:
string
类型,目标单元格中的值。
校验获取单元格tableItem
控件的控件值。
let value = await model.getTableItem("tableItem").value();
assert.equal(value,'tableItem');
value = model.getTableItem("tableItem").value()
assert value == 'tableItem'
editable(): Promise<boolean>
单元格是否可以被编辑,可编辑为true
,不可编辑为false
。
- 返回值:
boolean
类型,是否可编辑。
selected(): Promise<boolean>
单元格的选中情况,已选中为true
,未选中(折叠)为false
。
- 返回值:
boolean
类型,是否已选中。
rowIndex(): Promise<number>
获取当前单元格的行索引位置。
- 返回值:
number
类型,单元格中的行索引位置。
columnIndex(): Promise<number>
获取当前单元格的行索引位置。
- 返回值:
number
类型,单元格中的列索引位置。
checkState(): Promise<boolean | 'partial'>
获取单元格中的复选框选中状态。
- 返回值:
boolean
类型或是partial
字符串。true
代表选中,false
代表未选中,"partial"
代表部分选中(常见于含子选项的复选框)。
表头控件: HeaderItem
针对表头控件的定义和方法。通常点击表头的行为,是用于选中相应的行或列。
不只是表格有表头,某些树也有表头,同样的也可以操作这个控件。
如果只是需要获取表头的内容,而不需要实际点击或操作表头,建议仍使用Table
控件提供的rowHeaders()
和columnHeaders()
方法直接获取表头内容组成的数组。
类型文件定义
export interface IQHeaderItem extends IQtControl {
itemIndex(): Promise<number>;
value(): Promise<string>;
scrollIntoView(): Promise<void>;
}
class IQHeaderItem(IQtControl):
def itemIndex() -> int
def value() -> str
对象操作API
下面是HeaderItem
控件的对象方法。
value(): Promise<string>
获取表头的内容。
- 返回值:
string
类型,目标单表头的值。
校验获取表头headerItem
控件的控件值。
let value = await model.getHeaderItem("headerItem").value();
assert.equal(value, 'headerItem');
value = model.getHeaderItem("headerItem").value()
assert value == 'headerItem'
itemIndex(): Promise<number>
获取当前表头的索引位置,从0
开始。
- 返回值:
number
类型,单元格中的行索引位置。