2016-06-13 31 views
4

Ich benutze Drag and Drop in meinem QTableView (funktioniert). Ich sehe jedoch keinen Tropfenindikator. Ich sollte eine Zeile sehen, wo der Tropfen eingefügt werden soll, oder? Mindestens here sagen sie so.Warum sehe ich den Drop-Indikator in QTableView nicht?

Meine Init ist ziemlich Standard.

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

Ich habe keine Ahnung, warum ich den Indikator nicht sehe. Ein Stylesheet wird mit den Ansichten verwendet, könnte das der Grund sein. Ich habe jedoch das Stylesheet deaktiviert und sehe es immer noch nicht.

Die Ansicht verwendet ganze Zeilen zur Auswahl, nicht sicher, ob dies ein Problem verursacht. Also jeder Hinweis wird geschätzt.

- Bearbeiten -

Ab dem Kommentar unten, alle Auswahlmodi versucht: single, multi oder erweitert, keine visuelle Wirkung. Auch versuchte Zelle statt Zeilenauswahl, wieder keine Verbesserung.

- Edit 2 -

Derzeit unten another style proxy example, ähnlich der Auswertung verwiesen ursprünglich here

- Ähnliche -

QTreeView draw drop indicator
How to highlight the entire row on mouse hover in QTableWidget: Qt5
https://forum.qt.io/topic/12794/mousehover-entire-row-selection-in-qtableview/7

+1

Unklare des Kontextes aber: es hat auch mit dem Auswahlmodus zu tun. Was ist die Einstellung? Z.B. tableView-> setSelectionMode (QAbstractItemView :: ExtendedSelection); – AlexanderVX

+0

versuchte alle 3 Modi: Single, Multi, Extended - keine Wirkung –

Antwort

1

Ich sah das gleiche Problem, ich versuchte zwei Optionen, die beide für mich arbeiteten. IIRC, die Hilfe kam von einer Antwort auf SO.

  • wenn Sie QTreeView sind Subklassen, können Sie seine paintEvent() Methode außer Kraft setzen. Es ruft standardmäßig die Methode drawTree() und die paintDropIndicator() an (letztere ist Teil der privaten Klasse QAbstractItemView).

Sie können drawTree() von Ihrem paintEvent() nennen, und es sollte auch den Standard-Drag & Drop-Indikatoren außer Kraft setzen:

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

    void paintEvent(QPaintEvent * event) 
    { 
     QPainter painter(viewport()); 
     drawTree(&painter, event->region()); 
    } 
}; 
  • die andere Methode ist QProxyStyle und das Überschreiben der drawPrimitive() Methode Unterklasse. Wenn Sie das ElementQStyle::PE_IndicatorItemViewItemDrop als Parameter erhalten, können Sie es auf Ihre eigene Weise malen.

Der Code wird wie folgt aussehen:

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); 
     } 
    } 
}; 
+0

Versucht es, ich habe die QProxyStyleApproach verwendet. Ich sehe, dass der Teil der Zeichnungslinie aufgerufen wird, sehe aber keinen visuellen Effekt in meinem Fall. Sieht wie vorher aus. Ich werde einige der anderen virtuellen Implementierungen doc.qt.io/qt-5/qproxystyle ausprobieren.html # QProxyStyle Das Rect hat scheinbar immer 0x0 Größe. –

+0

Hier https://forum.qt.io/topic/62496/is-it-possible-for-a-qtableview-to-accept-a-drop-in-the-empty-area-below-its-last-last- Zeile diskutieren sie den gleichen Ansatz ('QProxyStyle'), aber es scheint NICHT für' QTableView' anwendbar zu sein –