为QTableWidget中的单元格设置默认对齐方式

23

我知道你可以使用以下方式为每个项目设置对齐方式:

TableWidget->item(0,0)->setTextAlignment(Qt::AlignLeft);

但是我希望为所有单元格设置默认对齐方式,以便每次创建新项目时无需再次设置。这是否可能?

3个回答

27

是的,这是可能的。但您需要了解的是,您修改的不是表格小部件的属性,而是表格小部件项的属性。首先创建自己的项目,并按照您的要求设置它。

 QTableWidgetItem * protoitem = new QTableWidgetItem();
 protoitem->setTextAlignment(Qt::AlignLeft);
 etc...

然后,每当你想创建一个新的项目时,不要使用构造函数,而是使用

 QTableWidgetItem * newitem = protoitem->clone();
 tableWidget->setItem(0,0, newitem);

克隆的另一种选择(未经测试)是在您的表格小部件上设置原型

QTableWidget::setItemPrototype ( const QTableWidgetItem * item )

如果您正在使用UI或项目是可编辑的,则这最后一种方法可能更合适。


10

我不认为有一个现成的方法可以解决这个问题,但以下两种方法可以实现:


1.) 子类化 QTableWidgetItem

MyTableWidgetItem::MyTableWidgetItem() :
    QTableWidgetItem()
{
    setTextAlignment( Qt::AlignLeft );
}

然而,这可能对于单个设置来说有些过度 + 您可能想要重载QTableWidgetItem的所有四个构造函数。


2.) 另一种方法是使用工厂而不是调用new
注意:链接的文章谈论了单元测试,但这样做有许多其他优点。

QTableWidgetItem* MyTableWidgetFactory::createTableWidgetItem( const QString& text ) const
{
    QTableWidgetItem* item = new QTableWidgetItem( text );
    item->setTextAlignment( Qt::AlignLeft );
    return item;
}

然后不是
QTableWidgetItem* myItem = new QTableWidgetItem( "foo" );
item->setTextAlignment( Qt::AlignLeft );

你可以做

QTableWidgetItem* myItem = myFactory->createTableWidgetItem( "foo" );

其中 myFactory 是一个 MyTableWidgetFactory 对象。


0
如果您正在为单元格使用委托,则应该派生QStyledItemDelegate;它有一个方法initStyleOption,可用于为使用您的委托的所有单元格设置样式选项。
void MyItemDelegate::initStyleOption(QStyleOptionViewItem *option,
                                     const QModelIndex &index) const override {
  // call base class implementation to set things up as default
  QStyledItemDelegate::initStyleOption(option, index);

  // override just the style options you want later
  option->displayAlignment = Qt::AlignCenter;
}

它更加优雅,不像使用 QTableWidgetItem 那样繁琐。


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