gpt4 book ai didi

qt - 如何将带有事件/信号的自定义小部件用作 QStyledItemDelegates?

转载 作者:行者123 更新时间:2023-12-01 07:21:18 26 4
gpt4 key购买 nike

我正在尝试使 QStyledItemDelegate 的行为类似于我编写的自定义 QWidget,因此我可以将我的代码切换到模型/ View 方法。

自定义 QWidget 是一个复杂的按钮,鼠标悬停在它的角上时会显示四个“子按钮”(因此总共有五个信号)。它还可以使用自定义拖动像素图进行拖放。为此,我使用了 mousePressEvent、mouseReleaseEvent、mouseMoveEvent、enterEvent 和 leaveEvent。这是有和没有鼠标悬停时显示的“子按钮”的样子: enter image description here

从那以后,我将我的主要代码切换为使用模型/ View 方法,并尝试将此小部件用作我自定义 ListView 的 QStyledItemDelegate。我试过将自定义 Widget 分配为这样的编辑器:

class ToolButtonDelegate( QStyledItemDelegate ):

def __init__( self, parent=None ):
super( ToolButtonDelegate, self).__init__( parent )
self.parent = parent

def createEditor( self, parent, option, index ):
if not index.isValid():
return False
btn = FancyButton( index.data( Qt.UserRole ), parent=parent )
return btn

这看起来很有希望,因为它为我单击的项目绘制了“FancyButton”类。但是,我需要这是一个鼠标悬停事件。经过更多研究后,我尝试将 QAbstractItemView.entered 插槽连接到 QAbstractItemView.edit 信号:

self.entered.connect( self.edit )

这仅适用于我将鼠标指针移到第一个项目上,然后出现以下错误:

edit: editing failed

所以现在我又被这些问题困住了:

  • 如何正确关闭编辑器(没有“QAbstractItemView.leave”事件或类似事件)。
  • 如何确保鼠标点击实际上触发了 FanyButton 类中的按钮,而不是仅仅与 QAbstractIremView 交互

我感觉我走错了方向。

最佳答案

我强烈建议您回到委托(delegate)而不是小部件,纯粹是出于性能原因 =)

您可以使用状态,特别是 QStyle::State_MouseOver,在绘制方法中处理委托(delegate)鼠标悬停事件。至于按钮上的点击,您可以覆盖接收所有鼠标事件的 editorEvent,然后处理鼠标点击发生的区域。例如:

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (option.state & QStyle::State_MouseOver)
{
// draw stuff which appears on mouse over
} else {
// draw stuff that appears when mouse is not over control
}
}

bool editorEvent(QEvent *event, QAbstractItemModel*, const QStyleOptionViewItem &option, const QModelIndex &index)
{
// Emit a signal when the icon is clicked
if(event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QRect editButtonRect = editIcon.rect().translated(editIconPos(option));
QRect deleteButtonRect = deleteIcon.rect().translated(deleteIconPos(option));

if(editButtonRect.contains(mouseEvent->pos()))
{
emit editIndexClicked(index);
} else if (deleteButtonRect.contains(mouseEvent->pos())) {
emit deleteIndexClicked(index);
}
}
return false;
}

你也可以看看这个话题HowTo create delegate for QTreeWidget? ,这是针对 QTreeWidget 的,但我认为同样的方法也适用于您的情况。

关于qt - 如何将带有事件/信号的自定义小部件用作 QStyledItemDelegates?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11183354/

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