Qt开发:列表QTableView列添加Button

在列表里面添加任何其他组件,比如Button,一般都需要继承delegate,然后继承后重绘,但是这样过于复杂,这里有一个简单的方法,理论上可以扩展到任何组件

以单个window里面添加到表格为例
代码
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void onTableBtnClicked();

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setFixedSize(700, 500);

    // add tableview
    QTableView *tableView = new QTableView(this);
    tableView->setMinimumSize(700, 500);
    tableView->verticalHeader()->hide(); // hide row number

    QStandardItemModel *tableModel = new QStandardItemModel(this);
    tableView->setModel(tableModel); // recommend to set model before detail settings

    // set columns
    QStringList columnTitles;
    columnTitles << "id" << "name" << "status" << "action";
    tableModel->setHorizontalHeaderLabels(columnTitles);
//    tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); // column fit the contents

    // add contents
    for(int i = 0; i < 7; i++)
    {
        tableModel->setItem(i, 0, new QStandardItem(QString::number(i + 1)));
        tableModel->setItem(i, 1, new QStandardItem(QString("hello qt tablview %1").arg(i)));
        tableModel->setItem(i, 2, new QStandardItem("normal"));

        // add button to the last column
        QPushButton *button = new QPushButton("Start");

        // set custom property
        button->setProperty("id", i); // set custom property
        button->setProperty("name", QString("hello qt tablview %1").arg(i));
        button->setProperty("status", "normal");

        // set click event
        connect(button, SIGNAL(clicked()), this, SLOT(onTableBtnClicked()));

        // notice every time insert the button at the last line
        tableView->setIndexWidget(tableModel->index(tableModel->rowCount() - 1, 3), button);
    }
}

void MainWindow::onTableBtnClicked()
{
    QPushButton *button = (QPushButton *)sender();
    qDebug() << button->property("id").toInt() << endl;
    qDebug() << button->property("name").toString() << endl;
    qDebug() << button->property("status").toString() << endl;
}

MainWindow::~MainWindow()
{

}

截图
Qt开发:列表QTableView列添加Button_第1张图片

思路

  • 使用QTableView的setIndexWidget函数添加额外的组件,需要指定好索引
  • 在Button上设置好自定义的属性,绑定信号槽后,在点击事件的响应中将属性值传出
  • 注意在设置Button时确保QTableView已经设置过model了

Tip

  • 如非必要,Qt中运用表格之类的复杂组件,用widget而不是view来做会轻松很多
  • 实际上田间button在Qt中用QTableWidget来实现更简单,只需要tableWidget->setCellWidget(row, col, pBtn),并可以扩展到其他组件

你可能感兴趣的:(Qt)