精华内容
下载资源
问答
  • QtableWidget和QTableView实现选中行冻结 在Qt列表的使用过程中,有一个列表是按照时间先后顺序瀑布流一样的刷新列表。如果并发量过大,可能列表刷新速度很快,用户如果想点击某条事件查看详情,一瞬间就被刷到...

    QtableWidget和QTableView实现选中行的冻结

    在Qt列表的使用过程中,有一个列表是按照时间先后顺序瀑布流一样的刷新列表。如果并发量过大,可能列表刷新速度很快,用户如果想点击某条事件查看详情,一瞬间就被刷到界面之外了。为了解决这个问题,需要用户点击时实现列表还是在刷新,但是页面中一直存在用户点击选项这样的功能。

    一、目标

    1. 后台数据一直刷新。
    2. 用户点击列表某行数据后实现行的冻结,点击行一直存在在显示页面。
    3. 添加恢复的按钮,点击后列表随着数据的添加继续进行滚动。

    二、实现过程

    在Qt assistant中查看QtableWidget,发现了这样一个接口

    void QTableWidget::scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)
    Scrolls the view if necessary to ensure that the item is visible. The hint parameter specifies more precisely where the item should be located after the operation.

    翻译过来就是滚动视图确保item可见。第一个参数设定item,第二个参数设定item显示的位置,总共有三种,分别是top、center、和bottom。
    在使用的过程中需要注意一点,就是每次刷新都要调用一次scrollToItem进行设定。因为每次添加或删除操作滚动条都会变化。
    例子:

    void Widget::on_beginBtn_clicked()//点击按钮添加行
    {
        QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg(iRow));
    
        ui->tableWidget->insertRow(iRow);
        ui->tableWidget->setItem(iRow,0,newItem);
        ui->tableWidget->sortItems(0,Qt::DescendingOrder);
        if(NULL != clickItem)//此处判断点击的item并调用函数设定显示位置
        {
            ui->tableWidget->scrollToItem(clickItem,QAbstractItemView::PositionAtCenter);
        }
        iRow++;
    
    }
    

    但是后来发现我代码中使用的是QTableView,那么QtableWidget的这个函数就不能使用,不过转念一想,QtableWidget不是QTableView的子类吗?看下QtableWidget里面scrollToItem的实现估计就能找到QTableView的实现了。
    查看QtableWidget里面scrollToItem的源码如下:
    title
    仔细看,里面真的有一个QTableView::scrollTo函数。如下所示:
    void QTableView::scrollTo(const QModelIndex &index, ScrollHint hint)
    具体的实现这里不贴了,想看的可以搜下源码,主要的实现就是通过QModelIndex的行和列的值对滚动条进行位移。

    根据以上说明,在代码中实现的流程主要有两点:

    1. 通过QTableView的Clicked信号,获取当前选中的ModelIndex的位置。
    2. InsertItem的地方调用scrollTo设定位置的值。

    不过在实现过程中发现,由于实现过程中有排序,选中的QModelIndex的row()值在InsertRow之后会有变化,所以需要根据要求更改选中的QModelIndex的行列值,具体修改的代码如下:

    if (m_currentClickItem.isValid())
    {	//如果添加item的position小于当前选中的row值,选中的row值+1
    	if (iPosition < m_currentClickItem.row())
    	{
    		m_currentClickItem = m_currentClickItem.sibling(m_currentClickItem.row() + 1, m_currentClickItem.column());
    	}
    	ui->PassMsgTableView->scrollTo(m_currentClickItem, QAbstractItemView::PositionAtCenter);
    }
    

    到此,我们要实现的选中行的冻结功能就完成了。

    三、总结

    Qt感觉就是一个宝藏,很多东西他们都帮你想到并且实现了,不过还是要自己费点功夫去找寻,不管是google还是百度。同时,有机会可以看下源码,你会有意外的发现。

    展开全文
  • //每页的记录行数(*) pageList: [10, 20, 50, 100,], //可供选择的每页的行数(*) showExport: true, //显示导出按钮 exportDataType: 'basic', //'basic':当前页的数据, 'all':全部的数据, 'selected':选中的...

    cade6c330bda05f614e70215db6ef39f.png

    还是接着上一篇文章的代码


    1、行内编辑插件

    x-editable下载地址:https://github.com/vitalets/x-editable

    引用行内编辑插件的相关文件

    {#    行内编辑插件#}
    <link href="{% static 'bootstrapTable/x-editable-develop/dist/bootstrap3-editable/css/bootstrap-editable.css' %}"rel="stylesheet"/>
    <script src="{% static 'bootstrapTable/x-editable-develop/dist/bootstrap3-editable/js/bootstrap-editable.min.js' %}"></script>
    
    
    // JS代码重新定义bootstrapTable
    var url = 'https://examples.wenzhixin.net.cn/examples/bootstrap_table/data';
        $("#table").bootstrapTable({
            toolbar: '#toolbar',                //自定义工具按钮
            url: url,                           //请求后台的URL(*)
            method: 'get',                      //请求方式(*)
            cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: true,                   //是否显示分页(*)
            pageSize: 10,                       //每页的记录行数(*)
            pageList: [10, 20, 50, 100, 'unlimited'], //可供选择的每页的行数(*)
            sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)
            pageNumber: 1,                      //初始化加载第一页,默认第一页
            columns: [
                {
                    field: 'id',
                    title: 'ID',
                }, {
                    field: 'name',
                    title: '姓名',
                    formatter: function (value, row, index) {
                        return '<a href="#" data-pk="' + row.Id + '">' + value + '</a>';
                    }
                }, {
                    field: 'price',
                    title: '价格'
                },
            ],                   //列参数
            // 单击事件
            onClickRow: function (row, $element) {
                curRow = row;
            },
            //渲染事件
            onLoadSuccess: function () {
                $("#table a").editable({
                    {#type: "text",                //编辑框的类型。支持text|textarea|select|date|checklist等#}
                    {#title: "用户名",              //编辑框的标题#}
                    type: "select",              //编辑框的类型。支持text|textarea|select|date|checklist等
                    source: [{value: 1, text: "开发部"}, {value: 2, text: "销售部"}, {value: 3, text: "行政部"}],
                    title: "选择部门",           //编辑框的标题
                    disabled: false,             //是否禁用编辑
                    emptytext: "空文本",          //空值的默认文本
                    mode: "inline",              //编辑框的模式:支持popup和inline两种模式,默认是popup
                    validate: function (value) { //字段验证
                        if (!$.trim(value)) {
                            return '不能为空';
                        }
                    }
                });
            },
        });

    在表格中给需要编辑的列添加a标签

    formatter: function (value, row, index) {
                        return '<a href="#" data-pk="' + row.Id + '">' + value + '</a>';
                    }

    然后对a标签做x-editable的初始化

    onLoadSuccess: function () {
                $("#table a").editable({
                    {#type: "text",                //编辑框的类型。支持text|textarea|select|date|checklist等#}
                    {#title: "用户名",              //编辑框的标题#}
                    type: "select",              //编辑框的类型。支持text|textarea|select|date|checklist等
                    source: [{value: 1, text: "开发部"}, {value: 2, text: "销售部"}, {value: 3, text: "行政部"}],
                    title: "选择部门",           //编辑框的标题
                    disabled: false,             //是否禁用编辑
                    emptytext: "空文本",          //空值的默认文本
                    mode: "inline",              //编辑框的模式:支持popup和inline两种模式,默认是popup
                    validate: function (value) { //字段验证
                        if (!$.trim(value)) {
                            return '不能为空';
                        }
                    }
                });
            },
    
    
    效果
    

    效果如下

    5f1435bc75eda52b323b2f27c8fbdd52.png

    冻结列插件

    引用行内编辑插件的相关文件

    {#    冻结列插件#}
    <link href="{% static 'bootstrapTable/bootstrap-table-master/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.min.css' %}"
          rel="stylesheet"/>
    <script src="{% static 'bootstrapTable/bootstrap-table-master/dist/extensions/fixed-columns/bootstrap-table-fixed-columns.min.js' %}"></script>
    
    // JS代码重新定义bootstrapTable
    data = [
            {
                "col-1": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-2": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-3": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-4": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-5": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-6": '每格内数据的对齐方式,每格内数据的对齐方式',
            }, {
                "col-1": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-2": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-3": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-4": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-5": '每格内数据的对齐方式,每格内数据的对齐方式',
                "col-6": '每格内数据的对齐方式,每格内数据的对齐方式',
            }
        ];
        $("#table").bootstrapTable({
            toolbar: '#toolbar',                //自定义工具按钮
            data: data,                         //获取数据
            fixedColumns: true,                 //是否开启冻结列
            fixedNumber: 2,                     //需要冻结的列数
            columns: [
                {
                    field: 'col-1',
                    title: 'col-1',
                }, {
                    field: 'col-2',
                    title: 'col-2',
                }, {
                    field: 'col-3',
                    title: 'col-3',
                }, {
                    field: 'col-4',
                    title: 'col-4',
                }, {
                    field: 'col-5',
                    title: 'col-5',
                }, {
                    field: 'col-6',
                    title: 'col-6',
                },
            ],                   //列参数
        });

    效果如下:

    bd6ebbb16ec9f34ff582f8a4d5bfa65e.png

    导出插件

    tableExport下载地址: hhurz/tableExport.jquery.plugin

    {#    导出按钮插件#}
    <script src="{% static 'bootstrapTable/bootstrap-table-master/dist/extensions/export/bootstrap-table-export.min.js' %}"></script>
    <script src="{% static 'bootstrapTable/tableExport/tableExport.min.js' %}"></script>
    
    // JS代码
    var url = 'https://examples.wenzhixin.net.cn/examples/bootstrap_table/data';
        $("#table").bootstrapTable({
            url: url,
            method: 'get',                  //请求方式(*)
            cache: false,                   //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: true,               //是否显示分页(*)
            pageSize: 10,                   //每页的记录行数(*)
            pageList: [10, 20, 50, 100,],   //可供选择的每页的行数(*)
            showExport: true,               //显示导出按钮
            exportDataType: 'basic',          //'basic':当前页的数据, 'all':全部的数据, 'selected':选中的数据
            exportTypes: ['csv', 'excel'],  //导出文件类型,[ 'csv', 'txt', 'sql', 'doc', 'excel', 'xlsx', 'pdf']
            columns: columns,
        });

    效果如下:

    722a87c7a288c3b6928f016aa102664c.png

    汇总行

    var url = 'https://examples.wenzhixin.net.cn/examples/bootstrap_table/data';
        $("#table").bootstrapTable({
            url: url,
            method: 'get',                  //请求方式(*)
            cache: false,                   //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: true,               //是否显示分页(*)
            pageSize: 10,                   //每页的记录行数(*)
            pageList: [10, 20, 50, 100,],   //可供选择的每页的行数(*)
            showFooter: true,               //显示页脚
            columns: [
                {
                    field: 'id',
                    title: 'ID',
                    footerFormatter: "总计:"
                }, {
                    field: 'name',
                    title: '姓名',
                    footerFormatter: function (rows) {
                        return rows.length //行数
                    }
                }, {
                    field: 'price',
                    title: '价格',
                    footerFormatter: function (rows) {
                        var field = this.field;
                        return '$' + rows.map(function (row) {
                            return +row[field].substring(1)
                        }).reduce(function (sum, i) {
                            return sum + i
                        }, 0)
                    }
                },
            ],
        });

    不需要引用额外的插件

    在初始化的时候显示页脚,每列通过footerFormatter定义页脚格式

    showFooter: true,               //显示页脚

    效果如下:

    f0b8df0f0b1c8cf1320cd13b5e131340.png

    列筛选

    引用列筛选插件的相关文件

    {#    列筛选插件#}
    <script src="{% static 'bootstrapTable/bootstrap-table-master/dist/extensions/filter-control/bootstrap-table-filter-control.min.css' %}"></script>
    <script src="{% static 'bootstrapTable/bootstrap-table-master/dist/extensions/filter-control/bootstrap-table-filter-control.min.js' %}"></script>
    
    
    var url = 'https://examples.wenzhixin.net.cn/examples/bootstrap_table/data';
        $("#table").bootstrapTable({
            url: url,
            method: 'get',                  //请求方式(*)
            cache: false,                   //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
            pagination: true,               //是否显示分页(*)
            pageSize: 10,                   //每页的记录行数(*)
            pageList: [10, 20, 50, 100,],   //可供选择的每页的行数(*)
            filterControl: true,            //显示列筛选
            columns: [
                {
                    field: 'id',
                    title: 'ID',
                }, {
                    field: 'name',
                    title: '姓名',
                    filterControl: "select",
                }, {
                    field: 'price',
                    title: '价格',
                    filterControl: "input",
                },
            ],
        });

    导入filter-control文件后,JS初始化bootstrapTable时,设置允许列筛选filterControl: true,

    在需要筛选列字段中添加 filterControl: "select",

    效果如下:

    bc56fe6ddeafb786a769d0363a9f7264.png
    展开全文
  • 冻结excel、列

    2014-06-03 10:43:00
    如果你想固定第一选中A2单元格,窗口-冻结窗口 如果你想固定第一列,选中B1单元格,窗口-冻结窗口 如果你想固定第一和第一列,选中B2单元格,窗口-冻结窗口 规则是冻结选中单元格左边和上边的所有区域...
    如果你想固定第一行,选中A2单元格,窗口-冻结窗口
    如果你想固定第一列,选中B1单元格,窗口-冻结窗口
    如果你想固定第一行和第一列,选中B2单元格,窗口-冻结窗口
    规则是冻结你选中单元格左边和上边的所有区域
    展开全文
  • Excel冻结nm列

    2015-11-17 19:18:14
    冻结13列为例。 选中D2单元格,然后在"视图"选项卡下,单击...冻结首行可以单击A2单元格或者选中第二,然后单击"视图"中的"冻结窗格"—"冻结拆分窗格"。冻结首列可以单击B1单元格或者选中第二列,然后单击"视

    以冻结1行3列为例。

    选中D2单元格,然后在"视图"选项卡下,单击"窗口"组中的"冻结窗格",在打开菜单中选择"冻结拆分窗格"(如下图所示)。

      

      

    冻结n行m列:现在看看冻结效果如下图所示。

    说明:冻结首行或首列也可以用此种方法。冻结首行可以单击A2单元格或者选中第二行,然后单击"视图"中的"冻结窗格"—"冻结拆分窗格"。冻结首列可以单击B1单元格或者选中第二列,然后单击"视图"中的"冻结窗格"—"冻结拆分窗格"。


    展开全文
  • excel中如何冻结前三或者其他

    千次阅读 2020-06-12 10:06:19
    然后我们选中第四选中的行数一般是冻结行数加上一; excel中如何冻结前三或者其他 然后我们点击工具栏中的视图; excel中如何冻结前三或者其他 之后我们点击冻结窗口的下来箭头; excel中如何冻结前三...
  • 02如果我们先冻结前三(123三),先点开excel表格的顶端导航栏的“视图”切换到视图功能,图如下 03视图界面有个“冻结窗格”按钮,我们把鼠标点在第四的随意一个单元格上,如下图 04下一步,点击“冻结窗格”...
  • 例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在数据表格的上层。同理,需要列冻结时,创建存放冻结列表格的div,并放置在数据表格的上层。如果需要行列都冻结时...
  • 如何冻结指定的和列当表格的数据比较多时,一页显示不完,往下拉,又看不到...就用鼠标选中图中红色筐标示的单元格(也就是要冻结和列的交接下的那一个单元格)2.工具栏中选-视图-冻结窗格-冻结拆分窗格。3....
  • 文章目录一、概述二、效果展示三、实现思路1、冻结行冻结列2、行高自适应3、蚂蚁线四、测试代码1、添加表格数据2、设置冻结行、列3、行高、列宽4、单元格背景色5、单元格文字6、其他相关测试五、相关文章 ...
  • EXCEL冻结窗口只想冻结前两

    千次阅读 2013-12-23 09:53:15
    如果要冻结几行或者几列,一起。选择某一个单元格就可以冻结它上侧和左侧的单元格拉。 实例: 如果只想冻结前两,列不冻结,仅需要选中A3单元格,点击冻结即可
  • 在Excel中有很多有意思的技巧,比如冻结窗格,但是我发现很多人还不太会使,今天我就说一说冻结窗格的事。 1.冻结标题这个应该是使用频率很高的一个功能,有时候...这个如果是想看标题,我们只需选中标题的下...
  • Execl同时冻结行和列

    2014-01-13 15:56:23
    冻结A1A1列 选中B2单元格,然后单击视图-->冻结窗格-->冻结拆分窗格。
  • JQUERY冻结table或列js

    千次阅读 2017-10-26 11:07:37
    * freezeRowNum - 要锁定的前几行行数,如果不锁定,则设置为0 * freezeColumnNum - 要锁定的前几列列数,如果列不锁定,则设置为0 * width - 表格的滚动区域宽度 * height - 表格的滚动区域
  • console.log(data) //获取选中行的数据 ``` 结果我选中一条或者是多条数据之后都获取不到数据,table的id我也检查过了没问题。 前端控制台输出是这样的: ``` Object data: Array(0) length: 0 __proto__...
  • 冻结表格某一的方法:1、依次在菜单栏依次点击“视图”→“冻结窗格”→...鼠标点击先选中第四,在菜单栏点击“视图”→“冻结窗格”→“冻结拆分窗格”。这样鼠标向下滚动,黑色粗线以上的单元格就固定不动了。...
  • 最近公司使用的是bootstraptable ,在这个过程中使用的冻结列,但是添加了冻结列之后,原本表格自带的checkbox无法使用,导致大部分功能失效,在网上查了很多的资料,最后找到一个办法: 你得理解冻结列的原理,...
  • 若是存在换行,会导致选中时的值存在多余的空白 {{item.label}} Option> Select> 需要将Options和下拉框的值保持在同一 {{item.label}}Option> Select> data数据层级 data数据具有数据层级结构,切勿过度扁平化...
  • DataGridView 选中行、列、单元格

    万次阅读 2014-07-22 21:53:43
    GridView属性中SelectionMode五个值FullRowSelect(选中整行)、
  • 在工作中,会经常数据量很大的表格,那么固定表头就很重要了。但是表头很多情况并不是一,而是多行,如何固定前两呢?...正确的做法为:(excel2010版)选中第三,选择视图——冻结窗口——冻结
  • 1.包含关键字加底纹颜色 crtl+A 选中整个表格->条件格式设置 2.冻结表头为第一选中第二的第一个单元格,再选择窗口–>冻结至第一
  • //切换分类 // NSIndexPath *path = [NSIndexPath indexPathForItem:1 inSection:0]; // [self.leftTableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionBottom];
  • 步骤2、只冻结前两 需要选中第三,选择【视图】-【冻结窗格】; 步骤3、在三角处打开,然后选择冻结窗格中的冻结拆分窗格; 步骤4、看一下转动效果,发现前两不动,剩下的序号到13了,还一直在动; 步骤5...
  • Excel固定第一表头——冻结窗口

    千次阅读 2017-09-30 11:58:07
    需求背景:excel表列数太多,记不住每列的意思,当拖动滚屏浏览数据是,需要对照着看那些列代表...选中第一表头的下面一(第2)——冻结窗口 如果表头还有一些不想看的选中这些——右键——隐藏
  • 点击表格,就会选中所在的和列。选择上方的日期,下方的表格整体也会变化
  • 冻结窗格

    2020-02-05 23:32:36
    冻结窗格(为了是标题窗格固定不动,方便浏览) 冻结首行(上下移动时不动) 选中将要冻结处——视图——冻结窗格——...将和列换位统一样式,然后借助CTRL键一起选中——视图——冻结窗格——冻结拆分窗格 ...
  • 注:如图,要对 sm 为 CheckboxSelectionModel 类型的 grid 实现指定锁住而不被选中,锁住的条件由该行的某一字段的数据决定,图中根据“状态”决定改行能否被选中。   实现方法(js中对这个 grid 的 sm 属性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,804
精华内容 1,921
关键字:

如何冻结选中的行