tableWidget添加按钮,添加下拉框,控件合并拆分

tableWidget与控件的组合应用 (如果对您有用记得点赞哦)

与按钮组合应用

动态创建按钮

创建按钮

	QPushButton *pushButton = new QPushButton();
    pushButton->setText("BT1");
    tableWidget->setCellWidget(0, 2, pushButton);

链接槽函数
这里所有创建的所有按钮 ,都与该函数链接

connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButton_Clicked()));

槽函数
这里我们获取按钮按下信号 对按钮改了个名

void MainWindow::pushButton_Clicked( ){
    /* 获取选中行号 */
    int row = tableWidget->currentRow();
    //声明一个widget 再降widget转为QPushButton
    QWidget *widget = tableWidget->cellWidget(row, 2);
    QPushButton *btn = (QPushButton *)widget;
    btn->setText("BUTTTON-" + QString::number(row));
}

效果

效果:

动态创建按钮及combox

在上节的右键添加表格源码中,增加对tablewidget添加按钮和combox功能(currentRow函数有选择的时候返回所选的行数,当没有选择的时候则返回-1,因此当无选择时默认为0)

#include "mainwindow.h"
#include <QHeaderView>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置主窗体的大小与位置 */
    this->setGeometry(0, 0, 800, 480);
    /* 实例化 */
    tableWidget = new QTableWidget(this);
    /* 设置tableWidget表居中 */
    setCentralWidget(tableWidget);
    /* 设置列数 */
    tableWidget->setColumnCount(4);
    /* 设置行数 */
    tableWidget->setRowCount(1);
    /* 设置列宽 */

    tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);    //x先自适应宽度
    tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);     //然后设置要根据内容使用宽度的列
    /* 使用标签设置水平标题标签 */
    tableWidget->setHorizontalHeaderLabels(QStringList()<<"温度(℃)"<<"时间(S)"<<"按钮"<<"下拉框" );

    /* 设置选中背景色 */
    tableWidget->setStyleSheet("selection-background-color:lightblue;");
    /* 开启交替行背景色 */
    tableWidget->setAlternatingRowColors(true);
    /* 设置整行选中的方式 */
    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    /* 设置为可以选中多个目标,按ctrl键 */
    tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

     /* 按行填写内容并设置每个单元格格式 */
    for (int row = 0; row < tableWidget->rowCount() ; row++)
    {
        /* 填写单元格内容 */
        tableWidget->setItem(row,0,new QTableWidgetItem("20"));
        tableWidget->setItem(row,1,new QTableWidgetItem("10"));
        /* 设置文本居中对齐 */
         tableWidget->item(row,0)->setTextAlignment(Qt::AlignCenter);
         tableWidget->item(row,1)->setTextAlignment(Qt::AlignCenter);
         /* 获取原有字体设置 */
         QFont font = tableWidget->item(row,0) ->font();
         /* 设置为粗体 */
         font.setBold(true);
         /* 字体大小 */
         font.setPointSize(12);
         /* 字体颜色 */
         tableWidget->item(row,0)->setTextColor(Qt::red);
         /* 设置字体 */
         tableWidget->item(row,0)->setFont(font);
    }
    /* 打开右键菜单 */
    tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    /* 添加按钮 */
    m_menu = new QMenu(this);
    m_actionAdd = new QAction("添加",m_menu);
    connect(m_actionAdd,&QAction::triggered,this,&MainWindow::slotAdd);
    /* 删除按钮 */
    m_actionDel = new QAction("删除",m_menu);
    connect(m_actionDel,&QAction::triggered,this,&MainWindow::slotDel);
    /* 清空按钮 */
    m_actionEmpty = new QAction("清空",m_menu);
    connect(m_actionEmpty,&QAction::triggered,this,&MainWindow::sloEmpty);
    /* 添加添加按钮 */
    m_menu->addAction(m_actionAdd);
    /* 添加删除按钮 */
    m_menu->addAction(m_actionDel);
    /* 添加清空按钮 */
    m_menu->addAction(m_actionEmpty);
    connect(tableWidget,&QTableWidget::customContextMenuRequested,this,&MainWindow::slotPopMenu);
//新增
     QPushButton *pushButton = new QPushButton();
     pushButton->setText("BT1");
    tableWidget->setCellWidget(0, 2, pushButton);
    connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButton_Clicked()));
}

//新增
void MainWindow::pushButton_Clicked( ){
    /* 获取选中行号 */
    int row = tableWidget->currentRow();
    //声明一个widget 再降widget转为QPushButton
    QWidget *widget = tableWidget->cellWidget(row, 2);
    QPushButton *btn = (QPushButton *)widget;
    btn->setText("BUTTTON-" + QString::number(row));
}
/* 添加单元格 */
void MainWindow::slotAdd()
{
    /* 获取选中行号 */
    int row = tableWidget->currentRow();
    /* 当没有任何选中目标时row返回值为-1 */
    /* 这是将在第一行添加 */
    if(row<0)     row=0;

    /* 在选中行号位置添加新行 */
    tableWidget->insertRow(row);
    /* 添加内容 */
    tableWidget->setItem(row,0,new QTableWidgetItem("20"));
    tableWidget->setItem(row,1,new QTableWidgetItem("10"));
    /* 文字水平居中 */
    /* 如需字体格式参上 */
    tableWidget->item(row,0)->setTextAlignment(Qt::AlignCenter);
    tableWidget->item(row,1)->setTextAlignment(Qt::AlignCenter);
    //添加按钮
    QPushButton *pushButton = new QPushButton();
    pushButton->setText("BTN");
    tableWidget->setCellWidget(row, 2, pushButton);
    connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButton_Clicked()));
    //添加combox
    QComboBox *combox = new QComboBox(tableWidget);
    combox->addItem("combox1");
    combox->addItem("combox2");
    //选择box2
    combox->setCurrentIndex(1);
    //添加到表格中
    tableWidget->setCellWidget(row, 3, combox);
    //链接信号槽
    connect(combox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboxchange())); // 实时获得结
    
}

效果:

在这里插入图片描述

按钮及combox合并与拆分

当combox选择combox1时 我们对button和combox进行合并,当选择combox2时,我们对button和combox进行拆分(这里合并直接合并到最后,如需自定义合并数目,以及多个合并时需注意表格的坐标系变换

举例:
合并前坐标
在这里插入图片描述

合并后坐标
在这里插入图片描述
贴combox槽函数代码

//该行的按钮名
void MainWindow::comboxchange(){
    /* 获取选中行号 */
    int row = tableWidget->currentRow();
    if(row<0)
        return;
    QWidget *widget = tableWidget->cellWidget(row, 3);
    QComboBox *combox = (QComboBox *)widget;

    if(combox->currentText() == "combox1")
    {
        //清空表格内容 及控件
        tableWidget->clear();
        //合并单元格
        if(row<tableWidget->rowCount())
        {
            tableWidget->setSpan( row , 2, tableWidget->rowCount() - 1, 1);
            tableWidget->setSpan( row , 3, tableWidget->rowCount() - 1, 1);
        }
        //重新添加控件 注意row为选中行
        for(int i=0 ;i<=row;i++)
        {
            QPushButton *pushButton = new QPushButton();
            pushButton->setText("BTN");
            tableWidget->setCellWidget(i, 2, pushButton);
            connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButton_Clicked()));

            QComboBox *combox = new QComboBox(tableWidget);
            combox->addItem("combox1");
            combox->addItem("combox2");
            combox->setCurrentIndex(1);
            tableWidget->setCellWidget(i, 3, combox);
            connect(combox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboxchange())); // 实时获得结
            if(i==row)
                combox->setCurrentIndex(0);
        }
    }else{ //拆分
        tableWidget->clearSpans();
        for(int i=0 ;i< tableWidget->rowCount() ;i++)
        {
            QPushButton *pushButton = new QPushButton();
            pushButton->setText("BTN");
            tableWidget->setCellWidget(i, 2, pushButton);
            connect(pushButton, SIGNAL(clicked()), this,SLOT(pushButton_Clicked()));

            QComboBox *combox = new QComboBox(tableWidget);
            combox->addItem("combox1");
            combox->addItem("combox2");
            combox->setCurrentIndex(1);
            tableWidget->setCellWidget(i, 3, combox);
            connect(combox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboxchange())); // 实时获得结
        }
    }

}

效果:

在这里插入图片描述

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值