QTableWidget

1.QTableWidget继承自QTableView。

QSqlTableModel能与QTableView绑定,但不能于QTableWidget绑定。​ QTableWidget是QTableView的子类,主要的区别是QTableView可以使用自定义的数据模型来显示内容(也就是先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型,并且其单元格数据是QTableWidgetItem的对象来实现的(也就是不需要数据源,将逐个单元格内的信息填好即可)。这主要体现在QTableView类中有setModel成员函数,而到了QTableWidget类中,该成员函数变成了私有。使用QTableWidget就离不开QTableWidgetItem。QTableWidgetItem用来表示表格中的一个单元格,正个表格都需要用逐个单元格构建起来。

QTableWidget和QTableView区别见:https://blog.csdn.net/zyc_csdn/article/details/78830542 

    tbl_task_list=new QTableWidget(this);
    tbl_task_list->setMinimumHeight (150);
    tbl_task_list->setMaximumWidth (500);
    tbl_task_list->setColumnCount(5);
    tbl_task_list->verticalHeader()->setVisible(false);
    tbl_task_list->horizontalHeader()->setVisible(true);
    tbl_task_list->setShowGrid(true); //设置显示格子线
    tbl_task_list->setEditTriggers(QAbstractItemView::NoEditTriggers);
    tbl_task_list->setSelectionBehavior(QAbstractItemView::SelectRows);
    tbl_task_list->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    QStringList header_task;
    header_task<<"任务名称"<<"小车"<<"任务状态"<<"任务产生时间"<<"任务相应时间";
    tbl_task_list->setHorizontalHeaderLabels(header_task);
    tbl_task_list->setObjectName("tbl_task_list");

/*
    //添加一行数据
    rows=tbl_task_list->rowCount ()+1;
    tbl_task_list->setRowCount (rows);
    addTaskItem("111",rows-1,0);
    addTaskItem("222",rows-1,1);
    addTaskItem("333",rows-1,2);
    addTaskItem("444",rows-1,3);
    addTaskItem("555",rows-1,4);

    //添加一行数据
    rows=tbl_task_list->rowCount ()+1;
    tbl_task_list->setRowCount (rows);
    addTaskItem("aaa",rows-1,0);
    addTaskItem("bbb",rows-1,1);
    addTaskItem("cccc",rows-1,2);
    addTaskItem("dddd",rows-1,3);
    addTaskItem("eeee",rows-1,4);
void Widget::addTaskItem(QString data,int row ,int col)
{
    QTableWidgetItem *item = new QTableWidgetItem(data);
    QFont font;
    font.setFamily ("Verdana");
    font.setBold (false);
    font.setPixelSize (12);
    item->setFont(font);
    item->setTextAlignment (Qt::AlignCenter);
    tbl_task_list->setItem(row,col,item);
}

2. 隐藏列表头和行表头,#include <QHeaderView>

  tbMotorWidget->verticalHeader()->setVisible(false); //隐藏列表头
  tbMotorWidget->horizontalHeader()->setVisible(false); //隐藏行表头

隐藏列 tw->setColumnHidden(0,true);

取隐藏列值tw->item(row,0)->text();

可以用来取数据库的id值,更新数据和删除数据很有用。

3. 设置表头的背景色

tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:#00BFFF;}");

4. 隐藏滚动条

twInfo->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
twInfo->setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff);

5. 设置垂直头不可见,即左边序号不见

         tableWidget->verticalHeader()->setVisible(true);//显示行序号1,2,3...

6. 每添加一条数据滚动条自动到底

       tableWidget->scrollToBottom();

7. 文本居中显示 

 QTableWidgetItem *item = new QTableWidgetItem(data);
 QFont font;
 font.setFamily ("Verdana");
 font.setBold (false);
 font.setPixelSize (12);
 item->setFont(font);
 item->setTextAlignment (Qt::AlignCenter);
 return item;

8. 指定表头字体

 QFont font;
 font.setBold(true);  
 tableWidget->horizontalHeader()->setFont(font);

9. 设置表头的内容充满整个表格的宽度

     tableWidget->horizontalHeader()->setStretchLastSection(true);

10. 选择行 

    tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次一行
    tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多选(Ctrl、Shift、Ctrl+A都可以)

  

11.QTableWidget使用setCellWidget设置控件默认是塞满填充的,如果强制设置了控件的尺寸,则默认左上角开始放置,有时候这种情况很难看,需要居中显示,QTableWidget可以设置文本居中显示,但是不能设置控件居中显示。使用如下方法可以实现: 

 if(tbDataWidget->rowCount()==0)
    {
        tbDataWidget->setRowCount(5);
        for(int i=0;i<5;i++)
        {
            addTableCheckItem(i);

            QPushButton *btnColor=new QPushButton(this);
            btnColor->setMinimumSize(15,15);
            btnColor->setMaximumSize(15,15);
            setButtonColor(btnColor,getRandomColor());
            QWidget *btnWidget = new QWidget;
            QHBoxLayout *hLayout = new QHBoxLayout(this);
            hLayout->setSpacing(0);
            hLayout->setMargin(0);
            hLayout->addWidget(btnColor);
            btnWidget->setLayout(hLayout);
            tbDataWidget->setCellWidget(i,0,btnWidget);
            connect(btnColor,&QPushButton::clicked,[=](){
                       slotColorButtonClicked(i);
                   });

        }

    }
void OperationWidget::slotColorButtonClicked(int row)
{

    QWidget *widget = (QWidget *)tbDataWidget->cellWidget(row, 0);
    QPushButton *btn = (QPushButton *)widget->children().at(1);
    QColor c = QColorDialog::getColor(Qt::blue);

    setButtonColor(btn,c);
}
void OperationWidget::setButtonColor(QPushButton *btn, QColor c)
{
    btn->setStyleSheet("background-color:rgb("+QString::number(c.red())+","
                            +QString::number(c.green())+","
                            +QString::number(c.blue())+");");
}

12.点击单元格触发事件

 connect(tbDataWidget,SIGNAL(cellClicked(int,int)),this,SLOT(slotTableItemSelected(int,int)));

void OperationWidget::slotTableItemSelected(int row, int col)
{


    if(tbDataWidget->item(row,3)->checkState()==Qt::Checked)
    {
       emit sigShowSelectedValue(true,tbDataWidget->item(row,0)->text());
    }
    else
    {
       emit sigShowSelectedValue(false,tbDataWidget->item(row,0)->text());
    }
}

13. 清除

tableWidget->clear();//清除所有可见数据(包括表头),行还在
tableWidget->clearContents();//只清除表中数据,不清除表头内容
tableWidget->setRowCount(0);//连行也清除掉

14. 添加控件,获得控件触发的行   

 QSlider *slider=new QSlider(this);
 slider->setOrientation(Qt::Horizontal);
 slider->setMinimum(1100);
 slider->setMaximum(1900);
 slider->setSingleStep(1);

 connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotSilderValueChange(int)));
 tbMotorWidget->setCellWidget(i,3,slider);
void OperationWidget::slotSilderValueChange(int value)
{
    QSlider *senderObj=qobject_cast<QSlider*>(sender());
    if(senderObj == nullptr)
    {
        return;
    }
    QModelIndex idx =tbMotorWidget->indexAt(QPoint(senderObj->frameGeometry().x(),senderObj->frameGeometry().y()));
    int row=idx.row();
    qDebug()<<"row"<<row;
}

15. 某一列禁止编辑 

QTableWidgetItem *item = new QTableWidgetItem(data);
if(!isIsEditable)
{
    item->setFlags(item->flags() & (~Qt::ItemIsEditable));
}

16.设置某一列宽度

tableWidget->setColumnWidth(0, 30);'

17.平均分配剩余的空白

tw->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

tw->horizontalHeader()->setSectionsClickable(false);

 

 


原文地址:https://www.cnblogs.com/ike_li/p/10207137.html