当前位置: 首页 > 知识库问答 >
问题:

如何使用带有事件/信号的自定义小部件作为QStyleDiteMeDelegates?

公孙森
2023-03-14

我试图使QStyleDiteMelegate的行为像我编写的自定义QWidget,这样我就可以将代码切换到模型/视图方法

此后,我将主代码切换为使用模型/视图方法,并试图将此小部件用作自定义ListView的QStyledItemDelegate。我尝试将自定义小部件指定为编辑器,如下所示:

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”类。然而,我需要这是一个鼠标上的事件。在进一步研究之后,我尝试将QAbstractTemView.Enterted插槽连接到QAbstractTemView.Edit Signal:

self.entered.connect( self.edit )
edit: editing failed
    null

共有1个答案

钮瀚
2023-03-14

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

您可以使用状态,特别是QStyle::State_MouseOver在paint方法中使用委托鼠标越过事件。至于对按钮的单击,您可以重写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;
    }

您也可以查看本主题如何为QTreeWidget创建委托?,这是针对QTreeWidget的,但我认为同样的方法也适用于您的情况。

 类似资料:
  • 介绍 (Introduction) UiBinder是一个旨在分离功能和用户界面视图的框架。 UiBinder框架允许开发人员将gwt应用程序构建为HTML页面,并在其中配置GWT小部件。 UiBinder框架使与UI设计人员的协作变得更容易,他们比XML源代码更熟悉XML,HTML和CSS UIBinder提供了一种定义用户界面的声明方式。 UIBinder从UI中分离出程序逻辑。 UIBind

  • GWT提供了三种创建自定义用户界面元素的方法。 有三种一般策略可供遵循 - Create a widget by extending Composite Class - 这是创建自定义小部件的最常用和最简单的方法。 在这里,您可以使用现有小部件来创建具有自定义属性的复合视图。 Create a widget using GWT DOM API in JAVA - 以这种方式创建GWT基本窗口小部件

  • 问题内容: 我想在小部件类绑定之后绑定自事件,以便在调用绑定函数时更改小部件的文本。例如,在文本窗口小部件中的内容更改之前,将调用我的绑定。 问题答案: 在您的情况下,发生的事情是您的打印值绑定发生在类绑定之前,而类绑定实际上是在接受用户输入并将其放入小部件中的。有几种方法可以解决此问题。您可以绑定而不是,或者可以使用内置的条目验证功能在每次按键时调用您的代码。使用该解决方案,您将获得所有需要的数

  • 在App开发中,经常会遇到页面间传值的需求,比如从新闻列表页进入详情页,需要将新闻id传递过去; Html5Plus规范设计了evalJS方法来解决该问题; 但evalJS方法仅接收字符串参数,涉及多个参数时,需要开发人员手动拼字符串; 为简化开发,mui框架在evalJS方法的基础上,封装了自定义事件,通过自定义事件,用户可以轻松实现多webview间数据传递。 仅能在5+ App及流应用中使用

  • 自定义事件主要会被用于框架、组件设计与实现中。 自定义的事件有许多的创建方式,但实际的业务场景中几乎不会被用到,网络上的文献记载其具体的使用场景也相对较少。 1. 使用 Event 构造函数 使用 Event 构造函数就可以创建一个自定义事件。 案例演示 预览 复制 复制成功! <style> .btn { border: 1px solid #4caf50; padding: 8px 12p

  • 问题内容: 我很难找到有关如何编写自定义窗口小部件的文档。 我的问题是: 如果我构建了一个自定义窗口小部件,可以将其等效地用于管理界面或正常形式吗? 如果我想允许用户编辑项目列表,我应该继承什么小部件?我需要重写/实现小部件的哪些方法? 哪种窗口小部件方法负责从用户输入返回到数据模型? 问题答案: 你是对的,Django没有提供有关此特定主题的文档。我建议你查看中的内置小部件django.form