Qt QAbstractItemDelegate拖动时绘制问题
我正在qabstractemdelegate(我自己的项委托类)中重载paint()函数 拖动时,它会绘制整个单元格的内容,这是我不想要的。我假设拖动时使用特定的东西调用paint()函数,但我似乎找不到它 我能找到的最接近的变量是所属视图类中的QState变量(访问函数QTableView::state()受保护)。通过在我的QTableView派生类上创建一个名为“IsDraging()”的函数,该函数调用该函数并返回是否拖动,我可以在委托类中确定我是否拖动,并且可以修改paint()函数 这几乎奏效了 问题是,它在原始单元格中显示了修改后的绘制图像,我不希望-我希望原始单元格中的图像保持不变 我想,我必须仔细研究一下这些例子,看看是否有什么东西能做到这一点 我已经浏览了Qt源代码,通过调用QItemDelegate::paint()函数,我可以看到它在哪里设置拖动pixmap,但它唯一改变的是它强制在项选项样式中选择QStyle::State_。这还不够,因为项目已被选中Qt QAbstractItemDelegate拖动时绘制问题,qt,drag,paint,qitemdelegate,Qt,Drag,Paint,Qitemdelegate,我正在qabstractemdelegate(我自己的项委托类)中重载paint()函数 拖动时,它会绘制整个单元格的内容,这是我不想要的。我假设拖动时使用特定的东西调用paint()函数,但我似乎找不到它 我能找到的最接近的变量是所属视图类中的QState变量(访问函数QTableView::state()受保护)。通过在我的QTableView派生类上创建一个名为“IsDraging()”的函数,该函数调用该函数并返回是否拖动,我可以在委托类中确定我是否拖动,并且可以修改paint()函数
有没有办法知道如何在拖动时显式绘制单元格内容?为什么不自己绘制呢?开始拖动时设置一个标志并记住活动的ModelIndex,设置标志时进行一些特殊的绘制,完成拖动后清除标志。您可以通过覆盖QAbstractItemView::startDrag来实现这一点。好的,这方面的最终答案是,是的,在“startDrag”上设置标志,而不是将其保留并在鼠标释放按钮事件中取消设置,只需调用基本方法,然后取消设置 原因是,光标的图像只被请求(并绘制)一次,而不是像我第一次想到的那样,在拖动过程中持续不断。保留标志集意味着光标图像将在不适当的时间绘制 因此,实现如下所示:
MyClass::dragStart(Qt::DropActions supportedActions)
{
__dragStart = true;
TableView::dragStart(supportedActions);
// request for drag cursor image happens here
__dragStart = false;
}
是的,这就是我最后要做的。必须清除鼠标上的标志。在Mac上工作。赢不起作用。就像我只是检查DraggingState的QTableView::state()标志一样。下一步?尝试在鼠标按下时设置初始鼠标位置,并在鼠标移动时检查当前鼠标位置。第一次拖动后工作正常,但第一次拖动仍然出错。Urk。这并没有完全解决它。我必须在模型上强制一个“dataChanged()”信号来强制刷新。眨眼,但它工作。