Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QAbstractItemDelegate拖动时绘制问题_Qt_Drag_Paint_Qitemdelegate - Fatal编程技术网

Qt QAbstractItemDelegate拖动时绘制问题

Qt QAbstractItemDelegate拖动时绘制问题,qt,drag,paint,qitemdelegate,Qt,Drag,Paint,Qitemdelegate,我正在qabstractemdelegate(我自己的项委托类)中重载paint()函数 拖动时,它会绘制整个单元格的内容,这是我不想要的。我假设拖动时使用特定的东西调用paint()函数,但我似乎找不到它 我能找到的最接近的变量是所属视图类中的QState变量(访问函数QTableView::state()受保护)。通过在我的QTableView派生类上创建一个名为“IsDraging()”的函数,该函数调用该函数并返回是否拖动,我可以在委托类中确定我是否拖动,并且可以修改paint()函数

我正在qabstractemdelegate(我自己的项委托类)中重载paint()函数

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

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

这几乎奏效了

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

我想,我必须仔细研究一下这些例子,看看是否有什么东西能做到这一点

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


有没有办法知道如何在拖动时显式绘制单元格内容?

为什么不自己绘制呢?开始拖动时设置一个标志并记住活动的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()”信号来强制刷新。眨眼,但它工作。