Почему я не вижу индикатор падения в QTableView?

Я использую перетаскивание в моем QTableView (работает). Однако я не вижу ни одного индикатора падения. Я должен увидеть строку, где должна быть вставлена ​​капля, не так ли? По крайней мере, здесь они так говорят.

Мой 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
/questions/9558243/qtableview-kak-navesti-kursor-myishi-na-tselyij-ryad/9558258#9558258

1 ответ

Я столкнулся с той же проблемой, я попробовал два варианта, которые оба работали для меня. 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);
        }
    }
};
Другие вопросы по тегам