1

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

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

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

这几乎可以工作。

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

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

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

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

4

2 回答 2

2

好的,对此的最终答案是,是的,在“startDrag”上设置标志,而不是让它留在周围并在鼠标释放按钮事件中取消设置,只需调用基本方法然后取消设置。

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

所以,实现看起来像:

MyClass::dragStart(Qt::DropActions supportedActions)
{
  __dragStart = true;
  TableView::dragStart(supportedActions);
                   // request for drag cursor image happens here
  __dragStart = false;
}
于 2011-03-28T14:36:02.583 回答
0

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

于 2011-03-25T07:07:00.220 回答