6

QTableView我在我的(作品)中使用拖放。但是,我没有看到任何下降指标。我应该看到应该插入 drop 的行,不是吗?至少在这里他们是这么说的。

我的 init 几乎是标准的。

    // see model for implementing logic of drag
    this->viewport()->setAcceptDrops(allowDrop);
    this->setDragEnabled(allowDrag);
    this->setDropIndicatorShown(true);
    this->m_model->allowDrop(allowDrop);

我不知道为什么我没有看到指标。样式表与视图一起使用,这可能是原因。但是,我已禁用样式表,但仍然看不到它。

该视图使用整行进行选择,不确定这是否会导致问题。因此,任何提示都值得赞赏。

- 编辑 -

在下面的评论中,尝试了所有选择模式:单、多或扩展,没有视觉效果。还尝试了单元格而不是行选择,再次没有改进。

-- 编辑 2 --

目前正在评估另一种样式代理示例,类似于下面的示例,最初在此处引用

- 有关的 -

QTreeView 绘制放置指示器
如何在 QTableWidget 中突出显示鼠标悬停的整行:Qt5
https://forum.qt.io/topic/12794/mousehover-entire-row-selection-in-qtableview/7
https://stackoverflow。 com/a/23111484/356726

4

1 回答 1

2

我遇到了同样的问题,我尝试了两个对我都有效的选项。IIRC,帮助来自对 SO 的回答。

  • 如果你是子类化QTreeView,你可以重写它的paintEvent()方法。它默认调用drawTree()方法和paintDropIndicator()一个(后者是QAbstractItemView私有类的一部分)。

您可以drawTree()从您的调用paintEvent(),它也应该覆盖默认的拖放指示器:

class MyTreeView : public QTreeView
{
public:
    explicit MyTreeView(QWidget* parent = 0) : QTreeView(parent) {}

    void paintEvent(QPaintEvent * event)
    {
        QPainter painter(viewport());
        drawTree(&painter, event->region());
    }
};
  • 另一种方法是继承 QProxyStyle并覆盖drawPrimitive()方法。当您将元素 QStyle::PE_IndicatorItemViewItemDrop作为参数获取时,您可以按照自己的方式进行绘制。

代码将如下所示:

class MyOwnStyle : public QProxyStyle
{
public:
    MyOwnStyle(QStyle* style = 0) : QProxyStyle(style) {}

    void drawPrimitive(PrimitiveElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const
    {
        if (element == QStyle::PE_IndicatorItemViewItemDrop)
        {
            //custom paint here, you can do nothing as well
            QColor c(Qt::white);
            QPen pen(c);
            pen.setWidth(1);

            painter->setPen(pen);
            if (!option->rect.isNull())
                painter->drawLine(option->rect.topLeft(), option->rect.topRight());
        }
        else
        {
            // the default style is applied
            QProxyStyle::drawPrimitive(element, option, painter, widget);
        }
    }
};
于 2016-06-14T08:06:58.503 回答