如何在QTableView中设置图标中心?

qic*_*ren 3 qt

NetworkPageForm::NetworkPageForm(QWidget *parent) :
      QWidget(parent),
      ui(new Ui::NetworkPageForm),
      devicesModel(NULL)
{
      ui->setupUi(this);
      devicesModel = new QStandardItemModel(0, 4, parent);
      devicesModel->setHeaderData(0, Qt::Horizontal, QObject::tr("IP"));
      devicesModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
      devicesModel->setHeaderData(2, Qt::Horizontal, QObject::tr("Last Online"));
      devicesModel->setHeaderData(3, Qt::Horizontal, QObject::tr("Status"));

      ui->devicesTableView->setModel(devicesModel);
      ui->devicesTableView->resizeColumnsToContents();
}



void NetworkPageForm::addDevice(const QString &ip, int device_type) {
    bool haveSameItem = false;

    for(int i=0; i<devicesModel->rowCount(); i++) {
        QStandardItem * ipItem = devicesModel->item(i, 0);
        QStandardItem * nameItem = devicesModel->item(i, 1);

        if(QString::compare(ipItem->text(), ip)== 0 && QString::compare(nameItem->text(), deviceStr)==0) {
            devicesModel->setData(devicesModel->index(i, 2), BaseModel::now());
            haveSameItem = true;
        }

    }

    if(!haveSameItem)
    {
        int last = devicesModel->rowCount();
        devicesModel->insertRow(last);
        devicesModel->setData(devicesModel->index(last, 0), ip);
        devicesModel->setData(devicesModel->index(last, 1), device_type);
        devicesModel->setData(devicesModel->index(last, 2), BaseModel::now());
        devicesModel->setData(devicesModel->index(last, 3), QIcon(":/res/images/online_icon.png"), Qt::DecorationRole);
        // This function does not work, the icon is algin left.
        // devicesModel->item(last, 3)->setTextAlignment(Qt::AlignCenter);
    }

    ui->devicesTableView->resizeColumnsToContents();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在QTableView中设置QIcon项目中心?

更新:

我创建了自己的QStyledItemDelegate子类,因为@RazrFalcon已经回答了.

#include <QStyledItemDelegate>

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    MyDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;

private slots:
};


void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
  if(index.column() == 3) {
       // TODO
  } else {
      QStyledItemDelegate::paint(painter, option, index);
  }
}

QSize MyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
    if(index.column() == 3) {
        // TODO
    } else {
        return QStyledItemDelegate::sizeHint(option, index);
    }
}

void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
    QStyledItemDelegate::setModelData(editor, model, index);
}
Run Code Online (Sandbox Code Playgroud)

并设置 ui->devicesTableView->setItemDelegate(new MyDelegate);

有人可以帮我如何在QTableView中设置图标列中心吗?

Raz*_*con 8

没有默认方式.您应该实现自己的QStyledItemDelegate.

UPD:示例添加

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);
    // disable default icon
    opt.icon = QIcon();
    // draw default item
    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, 0);

    const QRect r = option.rect;

    // get pixmap
    QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
    QPixmap pix = icon.pixmap(r.size());

    // draw pixmap at center of item
    const QPoint p = QPoint((r.width() - pix.width())/2, (r.height() - pix.height())/2);
    painter->drawPixmap(r.topLeft() + p, pix);
}
Run Code Online (Sandbox Code Playgroud)