1. 程式人生 > >Qt開發:列表QTableView列新增button

Qt開發:列表QTableView列新增button

在列表裡面新增任何其他元件,比如Button,一般都需要繼承delegate,然後繼承後重繪,但是這樣過於複雜,這裡有一個簡單的方法,理論上可以擴充套件到任何元件

以單個window裡面新增到表格為例 程式碼 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow
(); private slots: void onTableBtnClicked(); }; #endif // MAINWINDOW_H

mainwindow.cpp

#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QStringList>
#include <QString>
#include <QPushButton>
#include <QDebug>
#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() { }

截圖 在這裡插入圖片描述

思路

  • 使用QTableView的setIndexWidget函式新增額外的元件,需要指定好索引
  • 在Button上設定好自定義的屬性,繫結訊號槽後,在點選事件的響應中將屬性值傳出
  • 注意在設定Button時確保QTableView已經設定過model了