Почему я не вижу индикатор падения в 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);
}
}
};