表格类型对象

针对Qt中的表格和单元格提供的对象,CukeTest提供了TableTableItem两个控件。并且围绕了表格相关的控件提供了操作表格数据的API,无论是获取、编辑能够满足。类型文件如下:

针对表格控件还提供了相应的演练——演练:操作Qt应用中的Table,能够大大加深对于API的理解程度。

表格控件: Table

用于描述表格视图控件的对象类型——Table,由于是Qt的一种视图组件,能够改变排序之类的显示效果,作为一种单元格的复合容器而存在的。

类型文件定义

JavaScript
Python
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

针对单元格控件的定义和方法。

类型文件定义

JavaScript
Python
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

获取单元格的文本数据内容:

JavaScript
Python
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控件的控件值。

JavaScript
Python
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()方法直接获取表头内容组成的数组。

类型文件定义

JavaScript
Python
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控件的控件值。

JavaScript
Python
let value = await model.getHeaderItem("headerItem").value();
assert.equal(value, 'headerItem');
value = model.getHeaderItem("headerItem").value()
assert value == 'headerItem'

itemIndex(): Promise<number>

获取当前表头的索引位置,从0开始。

  • 返回值: number类型,单元格中的行索引位置。

results matching ""

    No results matching ""