QAbstractItemDelegate绘制时拖动问题

时间:2011-03-24 23:09:19

标签: qt drag paint qitemdelegate

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

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

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

这几乎可行。

问题在于它在原始单元格中显示了修改后的绘制图像,我不想要这样 - 我希望原始单元格中的图像保持不变。

我想,必须搜寻这些例子,看看是否有这样的事情......

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

任何方式知道如何在拖动时显式绘制单元格的内容?

2 个答案:

答案 0 :(得分:2)

好吧,关于这个问题的最终答案是,是的,在'startDrag'上设置标志,但是不要将它留在周围并在鼠标释放按钮事件上取消设置,只需调用基本方法然后取消设置。

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

因此,实现如下:

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

答案 1 :(得分:0)

你为什么不亲自这样做?在拖动开始时设置标志并记住活动的ModelIndex,在设置标志时执行一些特殊绘制,并在拖动完成时清除标志。您可以通过覆盖QAbstractItemView :: startDrag。

来完成此操作