一行多列的下拉多选框

一行多列的下拉多选框

很简单的一行多列的下拉多选框,就当是学习编写jquery插件的例子,该例子依赖jquery

相关js代码:

/**
 *  下拉多选插件,支持一行显示过个input框,显示多行
 *   by warhorse
 */
(function($){
    "use strict";

    var SelectCheckBox = function(element, options){
        this.$element = $(element);
        this.options = $.extend({}, SelectCheckBox.DEFAULTS, options); //使用jQuery.extend 覆盖插件默认参数

        // 多选框的名称
        if(!this.options.inputName){
            this.options.inputName = this.$element.attr("name");
            if(!this.options.inputName){
                this.options.inputName = this.$element.attr("id");
                this.options.inputName = this.options.inputName;
            }
        }

        // 获取并转换list为数组,支持数组类型[{'code':1, 'name':'aa'}],支持字符串类型:"1:aa;2:bb",支持对象{1:'aa', 2:'bb'}
        if(!this.options.list){
            this.options.list = this.$element.attr("list");
        }
        if(this.options.list && !$.isArray(this.options.list)){ // 1:aa;2:bb
            var list = [];
            var listType = typeof this.options.list;
            if(listType === 'string'){
                var entries = this.options.list.split(';');
                for(var i = 0; entries && i < entries.length; i++){
                    var entry = entries[i];
                    var values = entry.split(":");
                    list.push({'code': values[0], 'name':values[1]});
                }

            }else if(listType === 'object'){
                for(var key in this.options.list){
                    list.push({'code': key, 'name':this.options.list[key]});
                }
            }
            //
            this.options.list = list;
        }

        // 获取并转换data,支持数组类型[1,2,3],支持字符串类型:"1,2,3"
        if(!this.options.data){
            this.options.data = this.$element.attr("data");
        }
        if(this.options.data && !$.isArray(this.options.data)){
            this.options.data = this.options.data.split(',');
        }

    };

    SelectCheckBox.DEFAULTS = {
            list: null, // 支持数组类型[{'code':1, 'name':'aa'}],支持字符串类型:"1:aa;2:bb"
            data: '', // 支持数组类型[1,2,3],支持字符串类型:"1,2,3"
            col: 4, //默认一行4个
            formatter: null,
            seperator: ',',
            noneSelectedText: '请选择',
            width: 100,
            height: 100,
            onchange: null
    };

    SelectCheckBox.prototype.create = function () {
        var opts = this.options;

        // li的宽度百分比
        var liWidth = 100 / opts.col; 
        liWidth += '%';

        var width = this.$element.attr("width");
        if(!width){
            width = this.$element.width();
        }

        var lis = '';
        var title = ''; // 选中值对应的文字
        for(var i = 0; i < opts.list.length; i++){
            var entry = opts.list[i];

            var checked = false;
            for(var j = 0; opts.data && j < opts.data.length; j++){
                if(entry['code'] == opts.data[j]){
                    checked = true;
                    title += entry['name'] + opts.seperator;
                }
            }

            if(opts.formatter){
                var inputHtml = opts.formatter.call(this, entry, checked);
                lis += '<li align="left" style="width:'+liWidth+'">'+inputHtml+'</li>';

            }else{
                var checkedStr = checked ? 'checked="checked"' : '';
                lis += '<li align="left" style="width:'+liWidth+'"><label><input type="checkbox" name="'+opts.inputName+'" value="'+entry['code']+'" '+checkedStr+'/>'+entry['name']+'</label></li>';
            }
        }

        if(title){
            if(opts.seperator){
                title = title.substring(0, title.length - opts.seperator.length);
            }
        }else{
            title = opts.noneSelectedText;
        }

        // 主要的html代码
        var div = '<div class="selectCheckbox" id="scb_'+opts.inputName+'" style="width:100%; height:100%;cursor:pointer;">'
                +   '<div class="inputDiv" style="width:'+width+'px;overflow:hidden;">'
                +     '<p>'+title+'</p>'
                +   '</div>'
                +   '<div class="selectDiv" style="position:absolute; width:'+width+'px; display: none;" >'
                +     '<ul>'
                +        lis
                +     '</ul>'
                +   '</div>'
                +   '</div>';

        this.$element.append(div);
    };

    // 绑定事件
    SelectCheckBox.prototype.bindEvent = function(){
        var self = this;
        var $this = this.$element;
        var opts = this.options;
        // 绑定事件
        var inputDiv = $this.find(".inputDiv");
        var selecDiv = $this.find(".selectDiv");
        // 点击显示下拉框事件
        inputDiv.bind('click', function(){
            selecDiv.toggle();
        });
        // 鼠标离开选择面板隐藏下拉框事件
        $this.bind('mouseleave',function(){
            selecDiv.hide();
        });
        // 选择值后将选中的值显示在显示框上的事件
        selecDiv.find("input").bind('click',function(){
            self.fefresh();
        });
    };

    // 刷新显示
    SelectCheckBox.prototype.fefresh = function(){
        var self = this;
        var opts = this.options;
        var $this = this.$element;
        var data = [];
        var title = '';
        $this.find("input:checked").each(function(){
            title += $(this).parent("label").text() + opts.seperator;
            data.push($(this).val());
        });

        if(title){
            if(opts.seperator){
                title = title.substring(0, title.length - opts.seperator.length);
            }
        }else{
            title = opts.noneSelectedText;
        }

        $this.find(".selectCheckbox").find(".selectDiv").prev(".inputDiv").find("p").text(title);
        // 执行回调函数
        if(opts.onchange){
            opts.onchange.call(self, data.toString());
        }
        // 
        opts.data = data;
    };

    // 全不选
    SelectCheckBox.prototype.clear = function(){
        this.$element.find("input").attr("checked", false);
        this.fefresh();
    };

    // 全选
    SelectCheckBox.prototype.selectAll = function(){
        this.$element.find("input").attr("checked", true);
        this.fefresh();
    };

    // 设置选中的值
    SelectCheckBox.prototype.setData = function(data){
        if(data && !$.isArray(data)){
            data = data.split(',');
        }
        if(data && data.length > 0){
            this.$element.find("input").each(function(){
                var val = $(this).val();
                if($.inArray(val, data) > -1){
                    $(this).attr("checked", true);
                }
            });
            //
            this.fefresh();
        }

        return this;
    };

    // 获取选中的值
    SelectCheckBox.prototype.getSelected = function(){
        return this.options.data;
    };

    $.fn.selectCheckBox = function(options){
        var $this = $(this);
        // 判断是否初始化过的依据
        var scb = $this.data('selectCheckBox');

        if(!scb){
            var opts = typeof options == 'object' && options;
            // 初始化并缓存
            $this.data('selectCheckBox', (scb = new SelectCheckBox(this, opts)));
            // 创建节点
            scb.create();
            // 绑定事件
            scb.bindEvent();
        }

        // 调用方法
        if (typeof options === 'string') {
            if(scb){
                var fn = scb[options];
                if (!fn) {
                    throw ("selectCheckBox - No such method: " + options);
                }
                var args = $.makeArray(arguments).slice(1);
                return fn.apply(scb, args);
            }
        }

        return scb;
    };

})(jQuery);

相关css

.selectCheckbox .inputDiv{
    height:20px; 
    line-height:20px; 
    padding:2px 5px; 
    border:1px solid #CFCFCF; 
    background-color: rgba(255, 255, 255, 1);
    background-image: url('${ctx}/resource/images/arrow3_d.png');
    background-repeat: no-repeat;
    background-position: 99% 50%;
}
.selectCheckbox .selectDiv{
    padding:2px 5px; 
    border:1px solid #CFCFCF;
    background-color: #F8F8F8; 
    z-index: 1000;
    height: auto;
    line-height: 31px;
}
.selectCheckbox li{
    list-style-type: none;
    float: left;
}

调用方式:

  • html写法
<div name="outOrgType"></div>
  • 调用js写法:
$("div[name='outOrgType']").selectCheckBox({
    list: '1:aa;2:bb;3:cc', // 支持数组类型[{'code':1, 'name':'aa'}],支持字符串类型:"1:aa;2:bb"
    data: '1,2', // 支持数组类型[1,2,3],支持字符串类型:"1,2,3"
    col: 4, //默认一行4个
    formatter: null,
    seperator: ',', // 标题显示的分隔符
    noneSelectedText: '请选择', //没有选项的时候显示的标题
    onchange: null // 点击选中项的回调函数
});

示例图

这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以按照以下步骤在 PySide6 中使用 Table Widget 实现该界面: 1. 创建一个 Table Widget,并设置行数和列数为 5。 ```python from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QComboBox table = QTableWidget() table.setRowCount(5) table.setColumnCount(2) ``` 2. 设置第一列为多选框,第二列为下拉列表框。 ```python for row in range(5): item = QTableWidgetItem() item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Unchecked) table.setItem(row, 0, item) combo = QComboBox() combo.addItem("选项1") combo.addItem("选项2") table.setCellWidget(row, 1, combo) ``` 3. 获取用户选择的值。 ```python for row in range(5): item = table.item(row, 0) if item.checkState() == Qt.Checked: print(f"第{row+1}行被选中,第二列选择了{table.cellWidget(row, 1).currentText()}") ``` 完整代码如下: ```python from PySide6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QComboBox, QPushButton, QVBoxLayout, QWidget from PySide6.QtCore import Qt app = QApplication([]) table = QTableWidget() table.setRowCount(5) table.setColumnCount(2) for row in range(5): item = QTableWidgetItem() item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Unchecked) table.setItem(row, 0, item) combo = QComboBox() combo.addItem("选项1") combo.addItem("选项2") table.setCellWidget(row, 1, combo) button = QPushButton("提交") layout = QVBoxLayout() layout.addWidget(table) layout.addWidget(button) widget = QWidget() widget.setLayout(layout) widget.show() def on_submit(): for row in range(5): item = table.item(row, 0) if item.checkState() == Qt.Checked: print(f"第{row+1}行被选中,第二列选择了{table.cellWidget(row, 1).currentText()}") button.clicked.connect(on_submit) app.exec() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值