Drag and drop na QTableWidget

0

Cześć,
chciałem do swojej tabeli QTableWidget dodać możliwość przeciągania komórek.
Zrobiłem to w taki sposób:

ui->tab->setDragDropOverwriteMode(true);
ui->tab->setDragEnabled(true);
ui->tab->setDragDropMode(QAbstractItemView::InternalMove);

Przeciąganie działa, chciałbym jednak wprowadzić jakąś walidację zanim komórka zostanie przeniesiona.
Czy istnieje jakaś możliwość aby w prosty sposób wywołać utworzoną przeze mnie metodę która najpierw sprawdzić czy konkretna komórka może zostać przeniesiona w miejsce wybrane przez Usera.
W googlach wyszukałem, że można utworzyć klasę dziedziczącą po QTableWidget i nadpisać zdarzenie ale nie za bardzo wiem jak to zrobić :/

0

Utwórz w klasie okna filtr:

bool KlasaOkna::eventFilter(QObject* object, QEvent* event)
{
  if (object == ui->tab)
  {
    if (event->type() == QEvent::DragEnter)
    {
      if (niechciane)
        return true
    }
  }
  return false;
}

I w konstruktorze klasy okna podepnij kontrolkę tabeli do filtra:

ui->tab->installEventFilter(this);

Nie testowałem na tabeli, ale powinno zadziałać.

0

Zrobiłem tak jak napisałeś, moja metoda wygląda tak:

bool Rezerwator::eventFilter(QObject* object, QEvent* event)
{
    if (object == ui->table1)
    {
qDebug() << "event->type()" << event->type();

        if (event->type() == QEvent::DragLeave){qDebug() << " jest DragLeave ";}
        if (event->type() == QEvent::DragEnter){qDebug() << " jest DragLeave ";}
        if (event->type() == QEvent::DragMove){qDebug() << " jest DragMove ";}
        if (event->type() == QEvent::DragResponse){qDebug() << " jest DragResponse ";}
        if (event->type() == QEvent::Drop){qDebug() << " jest Drop ";}

    }
    return false;
}

Na tabeli mogę przeciągać komórki, metoda jest wywoływana jednak dostaję taki wynik:

 event->type() QEvent::Type(MetaCall)
 event->type() QEvent::Type(Timer)
 event->type() QEvent::Type(FocusAboutToChange)
 event->type() QEvent::Type(WindowDeactivate)
 event->type() QEvent::Type(FocusOut)
 event->type() QEvent::Type(Hide)
 event->type() QEvent::Type(Timer)

interesujące mnie zdarzenia nie są wywoływane :/

0

W takim razie spróbuj podpiąć filtr pod viewPort tabeli.

ui->tab->viewPort()->installEventFilter(this);

bool KlasaOkna::eventFilter(QObject* object, QEvent* event)
{
  if (object == ui->tab->viewPort())
  {
    ...
  }
  return false;
}
0

teraz dostaje:

 event->type() QEvent::Type(MouseMove)
 event->type() QEvent::Type(MouseMove)
 event->type() QEvent::Type(MouseMove)
 event->type() QEvent::Type(MouseMove)
 event->type() QEvent::Type(MouseMove)
 event->type() QEvent::Type(Leave)
 event->type() QEvent::Type(WindowDeactivate)
 event->type() QEvent::Type(Paint)

1 użytkowników online, w tym zalogowanych: 0, gości: 1