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())); // 实时获得结
}
}
}
效果: