关于在Qt中tableWidget表格中有按钮或者chebox选择点击事件

这里以checkbox为例:

基本思路:使用槽函数监听checkBox的改变,获取点击checkBox所在的行数和列数

//设置表头信息
void SystemMngForm::initNetConfigTableAttr()
{
    ui->tableWidget->setWordWrap(true);
    ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
    ui->tableWidget->verticalHeader()->hide();

    fileItem = new QTableWidgetItem(QString(""));
    ui->tableWidget->setHorizontalHeaderItem(0, fileItem);
    fileItem = new QTableWidgetItem(tr(u8"名称"));
    ui->tableWidget->setHorizontalHeaderItem(1, fileItem);

    fileItem = new QTableWidgetItem(tr(u8"地址"));
    ui->tableWidget->setHorizontalHeaderItem(2, fileItem);

    fileItem = new QTableWidgetItem(tr(u8"checkBox"));
    ui->tableWidget->setHorizontalHeaderItem(3, fileItem);
    
    ui->tableWidget->setAutoScroll(true);
    //每个元素居中
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    //单个选择
    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    //失去焦点
    ui->tableWidget->setFocusPolicy(Qt::NoFocus);

    //自适应表头
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    
    
    
}
//显示数据,里面有checkBox控件嵌套
void SystemMngForm::showNetConfigInfo()
{
    ui->tableWidget->setColumnCount(8);
    ui->tableWidget->setRowCount(2);

    for(int i = 0; i < 2; i++)
    {
        item = new QTableWidgetItem(QString(""));
        ui->tableWidget->setItem(i, 0, item);
        
        item = new QTableWidgetItem(u8"网口");
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 1, item);

        item = new QTableWidgetItem(u8"127.0.0.1");
        item->setTextAlignment(Qt::AlignCenter);
        ui->tableWidget->setItem(i, 2, item);

        checkBoxWidget= new Widget;
        checkBoxLayout = new QHBoxLayout();
        checkBox = new QCheckBox();
        checkBoxLayout ->addWidget(checkBox);
        //一定要设置为0,否则很难看
        checkBoxLayout->setMargin(0);
        checkBoxLayout->setAlignment(checkBox, Qt::AlignCenter);
        checkBoxWidget->setLayout(checkBoxLayout);
        ui->tableWidget->setCellWidget(i, 3, checkBoxWidget);
        
        //槽函数,stateChange(int)为checkBox的信号
        connect(checkBox, SIGNAL(stateChange(int)), this, SLOT(checkBoxChange(int));
        
    }
        initNetConfigTableAttr();
    
}

槽函数

void SystemMngForm::checkBoxChange(int)
{
    //全局变量,行和列
    checkBoxRow = 0;
    checkBoxColumn = 0;

    //
    QCheckBox *checkBox = dynamic_cast<QCheckBox *>(this->sender());
    if(checkBox = nullptr)
        return;
    
    //坐标转换获取坐标
    int x = checkBox->parentWidget()->frameGeometry().x();
    int y = checkBox->parentWidget()->frameGeometry().y();
    QModelIndex index = ui->tableWidget->indexAt(QPoint(x, y));
    int row = index.row();
    int column = index.column();
    
    qDebug()<<"row"<<row<<"column"<<column;

    //通过row、column找到控件
    QWidget *wig = ui->tableWidget->cellWidget(row, column);
    checkBox = wig->findChild<QCheckBox *>();
    if(checkBox->isChecked())
    {
        checkBoxRow = row;
        checkBoxColumn = column;
        qDebug)<<"checkBoxRow"<<checkBoxRow<<"checkBoxColumn"<<checkBoxColumn;
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值