如何在QTableView中设置图标中心? NetworkPageForm::NetworkPageForm(QWidget*父项): QWidget(母公司), ui(新ui::NetworkPageForm), DeviceModel(空) { 用户界面->设置用户界面(此); DeviceModel=新的QStandardItemModel(0,4,父级); DeviceModel->setHeaderData(0,Qt::水平,QObject::tr(“IP”); DeviceModel->setHeaderData(1,Qt::Horizontal,QObject::tr(“名称”); DeviceModel->setHeaderData(2,Qt::Horizontal,QObject::tr(“上次联机”); DeviceModel->setHeaderData(3,Qt::水平,QObject::tr(“状态”); ui->DeviceTableView->setModel(DeviceModel); ui->DeviceTableView->resizeColumnsToContents(); } void NetworkPageForm::addDevice(常量QString&ip,int设备类型){ bool haveSameItem=false; 对于(int i=0;irowCount();i++){ QStandardItem*ipItem=DeviceModel->item(i,0); QStandardItem*nameItem=DeviceModel->item(i,1); 如果(QString::compare(ipItem->text(),ip)==0&&QString::compare(nameItem->text(),deviceStr)==0){ DeviceModel->setData(DeviceModel->index(i,2),BaseModel::now()); haveSameItem=true; } } 如果(!haveSameItem) { int last=devicemodel->rowCount(); DeviceModel->insertRow(最后一个); DeviceModel->setData(DeviceModel->index(最后一个,0),ip); DeviceModel->setData(DeviceModel->index(最后一个,1),设备类型); DeviceModel->setData(DeviceModel->index(last,2),BaseModel::now()); DeviceModel->setData(DeviceModel->index(最后一个,3),QIcon(:/res/images/online_icon.png),Qt::DecorationRole); //此功能不起作用,图标为algin left。 //DeviceModel->item(最后一个,3)->setTextAlignment(Qt::AlignCenter); } ui->DeviceTableView->resizeColumnsToContents(); }

如何在QTableView中设置图标中心? NetworkPageForm::NetworkPageForm(QWidget*父项): QWidget(母公司), ui(新ui::NetworkPageForm), DeviceModel(空) { 用户界面->设置用户界面(此); DeviceModel=新的QStandardItemModel(0,4,父级); DeviceModel->setHeaderData(0,Qt::水平,QObject::tr(“IP”); DeviceModel->setHeaderData(1,Qt::Horizontal,QObject::tr(“名称”); DeviceModel->setHeaderData(2,Qt::Horizontal,QObject::tr(“上次联机”); DeviceModel->setHeaderData(3,Qt::水平,QObject::tr(“状态”); ui->DeviceTableView->setModel(DeviceModel); ui->DeviceTableView->resizeColumnsToContents(); } void NetworkPageForm::addDevice(常量QString&ip,int设备类型){ bool haveSameItem=false; 对于(int i=0;irowCount();i++){ QStandardItem*ipItem=DeviceModel->item(i,0); QStandardItem*nameItem=DeviceModel->item(i,1); 如果(QString::compare(ipItem->text(),ip)==0&&QString::compare(nameItem->text(),deviceStr)==0){ DeviceModel->setData(DeviceModel->index(i,2),BaseModel::now()); haveSameItem=true; } } 如果(!haveSameItem) { int last=devicemodel->rowCount(); DeviceModel->insertRow(最后一个); DeviceModel->setData(DeviceModel->index(最后一个,0),ip); DeviceModel->setData(DeviceModel->index(最后一个,1),设备类型); DeviceModel->setData(DeviceModel->index(last,2),BaseModel::now()); DeviceModel->setData(DeviceModel->index(最后一个,3),QIcon(:/res/images/online_icon.png),Qt::DecorationRole); //此功能不起作用,图标为algin left。 //DeviceModel->item(最后一个,3)->setTextAlignment(Qt::AlignCenter); } ui->DeviceTableView->resizeColumnsToContents(); },qt,Qt,有没有办法在QTableView中设置QIcon项目中心 更新: 我创建了自己的QStyledItemDelegate子类,如@RazrFalcon所回答的 NetworkPageForm::NetworkPageForm(QWidget *parent) : QWidget(parent), ui(new Ui::NetworkPageForm), devicesModel(NULL) { ui->setupUi(this);

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

更新: 我创建了自己的QStyledItemDelegate子类,如@RazrFalcon所回答的

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();
}
#包括
类MyDelegate:公共QStyledItemDelegate
{
Q_对象
公众:
MyDelegate(QWidget*parent=0):QStyledItemDelegate(parent){}
无效油漆(QPainter*油漆工、const QstyleOption视图项目和选项、,
常数QModelIndex&index)常数;
QSize sizeHint(常量QStyleOptionViewItem和option,
常数QModelIndex&index)常数;
void setModelData(QWidget*编辑器,QBStractItemModel*模型,
常数QModelIndex&index)常数;
专用插槽:
};
void MyDelegate::paint(QPainter*painter,常量qstyleoption视图项和选项,常量QModelIndex和索引)常量{
if(index.column()==3){
//待办事项
}否则{
QStyledItemDelegate::paint(油漆工、选项、索引);
}
}
QSize MyDelegate::sizeHint(常量QStyleOptionViewItem&option,常量QModelIndex&index)常量{
if(index.column()==3){
//待办事项
}否则{
返回QStyledItemDelegate::sizeHint(选项,索引);
}
}
void MyDelegate::setModelData(QWidget*编辑器、QBStractItemModel*模型、常量QModelIndex和索引)常量{
setModelData(编辑器、模型、索引);
}
设置
ui->devicesTableView->setItemDelegate(新建MyDelegate)


有人能帮我在QTableView中设置图标列中心吗?

没有默认方法。您应该实现自己的QStyledItemDelegate

UPD:添加了示例

#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);
}
void paint(QPainter*painter,const qstyleoption视图项和选项,const QModelIndex和索引)const
{
Q_断言(index.isValid());
QStyleOptionViewItemV4 opt=选项;
initStyleOption(&opt,index);
//禁用默认图标
opt.icon=QIcon();
//绘制默认项
QApplication::style()->drawControl(QStyle::CE_ItemViewItem,&opt,painter,0);
const QRect r=option.rect;
//获取pixmap
QIcon=qvariant_cast(index.data(Qt::DecorationRole));
QPixmap pix=icon.pixmap(r.size());
//在项目中心绘制pixmap
常数QPoint p=QPoint((r.width()-pix.width())/2,(r.height()-pix.height())/2);
painter->drawPixmap(r.topLeft()+p,pix);
}

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

UPD:添加了示例

#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);
}
void paint(QPainter*painter,const qstyleoption视图项和选项,const QModelIndex和索引)const
{
Q_断言(index.isValid());
QStyleOptionViewItemV4 opt=选项;
initStyleOption(&opt,索引);
//禁用默认图标
opt.icon=QIcon();
//绘制默认项
QApplication::style()->drawControl(QStyle::CE_ItemViewItem,&opt,painter,0);
const QRect r=option.rect;
//获取pixmap
QIcon=qvariant_cast(index.data(Qt::DecorationRole));
QPixmap pix=icon.pixmap(r.size());
//在项目中心绘制pixmap
常数QPoint p=QPoint((r.width()-pix.width())/2,(r.height()-pix.height())/2);
painter->drawPixmap(r.topLeft()+p,pix);
}

不需要在委派中执行。代理将使您的样式表不可用。 您可以在与像素相同大小的矩形PixMax的中间绘制图标,并将其返回到QQualTimeMt::DATA()函数中,并使用QT::DecorationRole。像这样:

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);
}

不需要在委派中做这件事。代理将使您的样式表不可用。 您可以在与像素相同大小的矩形PixMax的中间绘制图标,并将其返回到QQualTimeMt::DATA()函数中,并使用QT::DecorationRole。像这样:

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);
}

我创建QStyledItemDelegate子类,正如您所指出的。你能帮我完成我的代码吗?我创建了QStyledItemDelegate子类。你能帮我完成我的代码吗?你的解决方案当然很有趣,但是我如何从模型中找到单元格的宽度和高度呢?我无法硬编码值,因为小部件可以调整大小。具有固定屏幕的嵌入式系统的伟大解决方案您的解决方案当然很有趣,但如何从模型中找到单元格宽度和高度?我不能