gpt4 book ai didi

qt - QStyledItemDelegate-updateEditorGeometry如何工作?

转载 作者:行者123 更新时间:2023-12-04 17:12:53 30 4
gpt4 key购买 nike

我正在使用Qt 4.7。

我有一个模型,该模型在两列的QTableView中显示,我的目标是在QTableView中提供对该模型的内联编辑。

+-----------------+----------------+
| Axis position | Axis range |
+-----------------+----------------+
| Left | Fixed [0,1] |
| Left | Source: SRC1 |
| Right | Source: SRC2 |
| Left | Fixed [5,10] |
+-----------------+----------------+

第一列可通过使用简单的 QComboxBox在Right和Left之间切换来进行编辑,并且效果很好。问题出在我的第二栏上,该栏可以使用自定义窗口小部件进行编辑。

这个小部件很简单,它描述了一个范围。因此,有一个QComboBox可以选择范围的类型(“固定”:由用户指定值,“源”:从源的最小值/最大值动态调整值)。

这是我的自定义小部件的源代码:
class RangeEditor : public QWidget
{
Q_OBJECT

public:
RangeEditor( ... );
~RangeEditor();

public:
CurveView::ConfigAxes::Range range () const;
QVariant minimum() const;
QVariant maximum() const;
DataModel* model () const;

void range ( CurveView::ConfigAxes::Range range );
void minimum( QVariant minimum );
void maximum( QVariant maximum );
void model ( DataModel* model );

public slots:
void rangeTypeChanged( int type );

private: // --- External editors
QComboBox* editRange_;
QSpinBox* editMinimum_;
QSpinBox* editMaximum_;
QComboBox* editModel_;
};

RangeEditor::RangeEditor( ... ) : QWidget(parent)
{
editRange_ = new QComboBox(this);
editMinimum_ = new QSpinBox (this);
editMaximum_ = new QSpinBox (this);
editModel_ = new QComboBox(this);

QHBoxLayout* layout = new QHBoxLayout();
setLayout(layout);

layout->addWidget( editRange_ );
layout->addWidget( editMinimum_ );
layout->addWidget( editMaximum_ );
layout->addWidget( editModel_ );

editRange_->addItem( "Fixed" );
editRange_->addItem( "Source" );

editModel_->setCurrentIndex(0);
editModel_->hide();

QObject::connect( editRange_, SIGNAL(currentIndexChanged(int)),
this, SLOT (rangeTypeChanged(int)) );
}

void RangeEditor::rangeTypeChanged( int type )
{
if ( type==CurveView::ConfigAxes::FIXED )
{
editMinimum_->show();
editMaximum_->show();
editModel_->hide();
}
else if ( type==CurveView::ConfigAxes::SOURCE )
{
editMinimum_->hide();
editMaximum_->hide();
editModel_->show();
}
}

好的,现在,我创建了一个QStyledItemDelegate来为 View 提供用于我的列的自定义编辑器。这是我的做法:
class ConfigAxesDelegate : public QStyledItemDelegate
{
public:
ConfigAxesDelegate( ... );
~ConfigAxesDelegate();

public:
virtual QWidget* createEditor ( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
virtual void setEditorData ( QWidget* editor, const QModelIndex& index ) const;
virtual void setModelData ( QWidget* editor, QAbstractItemModel* model, const QModelIndex& index ) const;
virtual void updateEditorGeometry( QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
};

QWidget* ConfigAxesDelegate::createEditor( QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
if ( index.column()==0 ) // Position
{
PositionEditor* editor = new PositionEditor(parent);
return editor;
}
else if ( index.column()==1 ) // Range
{
RangeEditor* editor = new RangeEditor(parent);
return editor;
}
else
{
return QStyledItemDelegate::createEditor(parent,option,index);
}
}

void ConfigAxesDelegate::updateEditorGeometry( QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
// WHAT TO DO HERE?
editor->setGeometry( option.rect );
}

基本上,我得到的是一个像素高度编辑器。

这是结果的屏幕截图:

我试图将 updateEditorGeometry更改为以下内容:
void ConfigAxesDelegate::updateEditorGeometry( QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QRect r = option.rect;
r.setSize( editor->sizeHint() );
editor->setGeometry( r );
}

这似乎解决了尺寸问题,但没有解决位置问题:

我感到有点迷失,因为我不知道问题是否来自我的自定义小部件(没有为Qt提供足够的信息来正确计算其位置), View (可能是一些会使编辑器尺寸变小的边距),还是 updateEditorGeometry()方法。

任何帮助,不胜感激,感谢您的阅读!

最佳答案

我会说通过调用以下命令来设置编辑器的几何形状:

editor->setGeometry(rect);

应该正常工作;您遇到的情况是,您的编辑器是使用QHBoxLayout构建的,它具有默认的边距和间距设置。表格 View 行的默认高度小于编辑器的高度,这使您的编辑器可以调整大小;屏幕截图上的一个像素行将是:上边距+控件剩余的值+下边距。

通过为表格 View 启用垂直标题,您将能够调整行高的大小,以使编辑器控件完全可见。

您可能会做些什么:

1.删​​除\减少布局的间距和边距:
QHBoxLayout* layout = new QHBoxLayout();
layout->setSpacing(1);
layout->setMargin(1);
setLayout(layout);

在这种情况下,可以通过以下方式更新编辑器的几何:
QRect rect = option.rect;
QSize sizeHint = editor->sizeHint();

if (rect.width()<sizeHint.width()) rect.setWidth(sizeHint.width());
if (rect.height()<sizeHint.height()) rect.setHeight(sizeHint.height());

editor->setGeometry(rect);

要不就
editor->setGeometry(rect);

应该适合你

2.您还可以考虑将弹出式编辑器用于行\单元格值

3.调整窗口小部件的行高以适合单元格编辑器。

希望这会有所帮助,问候

关于qt - QStyledItemDelegate-updateEditorGeometry如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5457154/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com