近期在操作xlang时,学到了不少的操作要点。
一、关于数据表格显示控件QTableView的操作
这里先说说控件的内容显示以及对齐居中操作
以下是标准写法
//这里温习一下SQL的用法
Sql.Connection connMain = new Sql.Database.getConnection ("sqlserver");
if (connMain != nilptr)
{
connMain.create ("localhost", "sa", "123456");
Sql.Statement stat = connMain.createStatement();
Sql.ResultSet ts1 = stat.executeQuery ("Select name from TMT_INFO.dbo.syscolumns Where ID=OBJECT_ID('TMT_INFO.dbo.doff') order by colid");
//获取行数量
String[] ts1count = new String[ts1.getRowCount()];
//定义一个列循环变量
int ii = 0;
//循环将行标题放入数组
while (ts1.isEof() == false)
{
ts1count[ii] = ts1.getString ("name");
ts1.next();
ii++;
}
ii = 0;
//查找内容体
Sql.ResultSet ts = stat.executeQuery ("select * from TMT_INFO.dbo.doff where MC_No = 6132 and DateTime >= '2019-12-06 17:23:05.0000000' order by DateTime desc");
//开始使用tableWidget
//设置tableWidget的列数量
tableWidget.setColumnCount (ts1.getRowCount() );
//将表头内容设置到tableWidget
tableWidget.setHHColumns (ts1count);
//设置tableWidget的行数
tableWidget.setRowCount (ts.getRowCount() );
ii = 0;
//将表体内容设置到tableWidget的每一个单元格,先行循环,再列循环
//行循环
while (ts.isEof() == false)
{
//列循环
for (int i : ts1.getRowCount() )
{
//将内容设置到ii行,i列的单元格
tableWidget.setItem (ii, i, nilptr, ts.getString (ts1count[i]) );
//将ii行,i列的单元格的内容设置为垂直和水平居中
tableWidget.setItemAlign (tableWidget.getItem (ii, i), Constant.AlignCenter);
}
//另一种方式设置居中
tableWidget.setStyleSheet ("QTableWidget::item{alignment: center;}");
ii++;
ts.next();
}
//用一个for循环将表头设置为根据表体内容自适应列宽
for (int i = 0; i < ts1count.length; i++)
{
tableWidget.horizontalHeader().setResizeMode (i, ResizeMode.ResizeToContents);
}
tableWidget.setEditTriggers (0);
}
这里解释一下setItemAlign的参数的使用
第一个参数,必须使用 tableWidget.getItem(行序号,列序号) 去获取 item 的值
第二个参数,可以在下面的值中间选
public static const int AlignLeft = 0x0001,
AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignHorizontal_Mask = AlignLeft | AlignRight | AlignHCenter | AlignJustify | AlignAbsolute,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignBaseline = 0x0100,
// Note that 0x100 will clash with Qt::TextSingleLine = 0x100 due to what the comment above
// this enum declaration states. However, since Qt::AlignBaseline is only used by layouts,
// it doesn't make sense to pass Qt::AlignBaseline to QPainter::drawText(), so there
// shouldn't really be any ambiguity between the two overlapping enum values.
AlignVertical_Mask = AlignTop | AlignBottom | AlignVCenter | AlignBaseline,
AlignCenter = AlignVCenter | AlignHCenter;
=========================================================================
二、getOpenFileName 的用法
//因为原 getOpenFileName 方法被阻塞,所以这里新建一个线程
new Thread()
{
//新建一个run方法
void run()
{
//在这里执行打开动作
String file = "";
file = QFileDialog.getOpenFileName ("打开文件", file, "jpg(*.jpg);;bmp(*.bmp)", nilptr);
runOnUi (new Runnable()
{
//获取到文件路径内容后,重新返回到UI线程-->runOnUi
void run() override
{
// 回到UI线程中继续执行接下来的动作
QMessageBox.Information("",file,QMessageBox.Ok,QMessageBox.Ok);
}
});
}
} .start();
注意点:
1、如果项目中使用了sql的插件或者库,sql使用到的ADO组件会修改getOpenFileName的COM调用模型,使getOpenFileName的调用卡在最后一步。这时候需要新建一个线程,让文件打开窗体弹出来之后,再重新交回给 RunOnUI 线程进行。
2、有关于xlang或者QT的界面数据刷新,必须使用 RunOnUI 线程进行,这个线程是单线程的,使用 new thread 进行控件的控制会使程序报错。
三、关于数据控件的数据量和显示效率
1,QT中的 tablewiget 功能非常强大,每一个单元格都可以放入控件(浏览器,按钮,下拉甚至窗体等),是一个非常复杂的控件,当输入显示非常多,比如超过200行的时候,会非常卡顿,这时候推荐使用数据分页,类似下图

2,如果不想使用数据分页,可以使用 TreeView 控件,显示效率非常高,

212

被折叠的 条评论
为什么被折叠?



