【问题标题】:QAbstractItemDelegate painting while dragging problemQAbstractItemDelegate 绘制时拖动问题
【发布时间】:2011-03-24 23:09:18
【问题描述】:

我正在重载 QAbstractItemDelegate(我自己的 Item 委托类)中的 paint() 函数。

拖动时,它会绘制整个单元格的内容,这是我不想要的。我假设在拖动时使用特定的东西调用了 paint() 函数,但我似乎没有找到它。

我能找到的最接近的是拥有视图类中的 QState 变量(访问函数 QTableView::state() 受到保护。)通过在我的 QTableView 派生类上创建一个名为“isDragging()”的函数它调用该函数并返回是否拖动,我可以在我的委托类中确定我是否在拖动,并且可以修改 paint() 函数。

这几乎行得通。

问题是它在原始单元格中显示修改后的绘画图像,这是我不想要的 - 我想保持原始单元格中的图像保持不变。

我想必须搜索示例,看看是否有什么东西可以做到这一点......

我已经浏览了 Qt 源代码,我可以通过调用 QItemDelegate::paint() 函数看到它设置拖动像素图的位置,但它唯一改变的是它在项目选项样式中强制 QStyle::State_Selected。这还不够,因为该项目已被选中。

有什么方法可以知道如何在拖动时显式绘制单元格的内容?

【问题讨论】:

    标签: qt drag paint qitemdelegate


    【解决方案1】:

    好的,对此的最终答案是,是的,将标志设置为“startDrag”,但与其在鼠标释放按钮事件中保留它并取消设置,只需调用基本方法然后取消设置。

    原因是光标的图像只被请求(和绘制)一次 - 在拖动过程中不是连续的,正如我最初想到的那样。保留标志集意味着光标图像将在不适当的时间绘制。

    所以,实现看起来像:

    MyClass::dragStart(Qt::DropActions supportedActions)
    {
      __dragStart = true;
      TableView::dragStart(supportedActions);
                       // request for drag cursor image happens here
      __dragStart = false;
    }
    

    【讨论】:

      【解决方案2】:

      你为什么不自己做呢?拖动开始时设置一个标志并记住活动的ModelIndex,设置标志时做一些特殊的绘画,并在拖动完成时清除标志。您可以通过覆盖 QAbstractItemView::startDrag 来做到这一点。

      【讨论】:

      • 是的,我最后就是这么做的。必须清除鼠标上的标志。
      • 适用于 Mac。对胜利不起作用。就像我只是检查 DraggingState 的 QTableView::state() 标志一样。下一个?
      • 尝试在鼠标按下时设置初始鼠标位置,并在鼠标移动时检查当前鼠标位置。第一次拖动后工作正常,但第一次拖动仍然搞砸了。
      • 乌尔克。那并没有完全解决它。我不得不在模型上强制一个“dataChanged()”信号来强制刷新。闪烁,但有效。
      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2021-07-18
      • 1970-01-01
      • 2021-07-30
      • 2012-10-31
      相关资源
      最近更新 更多