xlang的QTableView和多线程操作以及注意点

近期在操作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 控件,显示效率非常高,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值