如何将QTableWidgetItem图标放置在单元格中心?

10
我想让一个表格单元只显示图标而没有文字。
我发现QTableWidgetItem类有一个用于调整文本对齐的方法 (int QTableWidgetItem::textAlignment () const)
我找不到任何方法来调整图标的位置(即使在单元格中没有文本时,它似乎会固定在左侧)
请看“状态”和“能源”列。 alt text

1
你需要使用一个委托。 - Sohail
5个回答

9

您可以通过样式选项影响图标与文本之间的位置。

如果QTableWidgetItem是通过不接受文本参数的构造函数构造的,则Qt :: DisplayRole数据项未设置,文本将不会显示,也不会影响图标的显示矩形。

我能够通过子类化QTableWidget,重写viewOptions方法并设置视图选项中的decorationAlignment字段来影响QTableWidgetItem的图标位置,像这样:

QStyleOptionViewItem MyTableWidget::viewOptions() const
{
    QStyleOptionViewItem option = QTableWidget::viewOptions();
    option.decorationAlignment = Qt::AlignHCenter | Qt::AlignCenter;
    option.decorationPosition = QStyleOptionViewItem::Top;
    ...
    return option;
}

1
很遗憾,无法将option.decorationPosition设置为中心,只能设置为顶部、左侧、右侧或底部。这似乎是一个相当大的遗漏。要实现此功能,您需要使用QTableWidget::setCellWidget()来设置带有QPixmap的QLabel,或者使用QStyledItemDelegate并覆盖QStyledItemDelegate::paint()。还可以尝试覆盖QTableWidgetItem或QTableWidget的绘制方法。 - Andy Brice

8
我曾有一个类似的问题,我没有使用子类化,而是通过在单元格中使用QLabel来解决它(不幸的是,我也需要使用布局):
int row = 0;
int column = 0;
QSize sizeIcon(32, 32);
QString iconSrc = ":/Actions/myicon.png";

QWidget *pWidget = new QWidget();
QLabel *label = new QLabel;
label->setMaximumSize(sizeIcon);
label->setScaledContents(true);
label->setPixmap(QPixmap(iconSrc));
QHBoxLayout *pLayout = new QHBoxLayout(pWidget);
pLayout->addWidget(label);
pLayout->setAlignment(Qt::AlignCenter);
pLayout->setContentsMargins(0,0,0,0);
pWidget->setLayout(pLayout);

this->ui->myTableWidget->setCellWidget(row, column, pWidget);

我使用了以下方法:
http://falsinsoft.blogspot.de/2013/11/qtablewidget-center-checkbox-inside-cell.html

4
您可以使用以下方法:setCellWidget。
QLabel *lbl_item = new QLabel();
lbl_item ->setPixmap(*ui->my_label->pixmap());
lbl_item ->setAlignment(Qt::AlignHCenter);
ui->my_tablewidget->setCellWidget(row, column, lbl_item);

这将把图标置于中心。

2

我认为QTableWidgetItem的基本行为不允许您更改与图标相关的任何内容...

看一下Qt的示例“Star Delegate Example”,也许您会在解决问题时发现有趣的东西!这是一项有点工作量的任务,但当单元格不包含任何文本时,您应该能够以不同的方式“绘制”单元格!

希望这些能有所帮助!


1

看起来你必须继承QTableWidgetItem类并重写paintEvent函数,在这个函数中你可以在想要的地方绘制图标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接