Qt После события drop - PullRequest
       9

Qt После события drop

2 голосов
/ 30 ноября 2011

Мне нужно обработать некоторые данные ПОСЛЕ того, как в виджете произошло событие сброса.

Т.е. пользователь выбирает некоторые элементы в списке A и помещает их в список B. Моей программе необходимо сравнить 2 списка после того, как B добавил элементы, выбранные из A.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Работай!

Мой код для всех, кто интересуется:

class MyList(QListWidget):
    def __init__(self , parent = None):
        super(MyList, self).__init__(parent)

        self.setAlternatingRowColors(True)
        self.setDragDropMode( QAbstractItemView.InternalMove ) 


    def dropEvent( self , event ):
        # get index to insert at
        insertPos   = event.pos()
        fromList    = event.source()
        insertRow   = fromList.row( fromList.itemAt( insertPos ) )

        lowestRow = insertRow
        for item in fromList.selectedItems():
            name = item.text()
            sip.delete( item )

            listItem = QListWidgetItem( name )
            listItem.setTextAlignment( Qt.AlignHCenter )
            self.insertItem( insertRow , listItem ) 
            insertRow += 1

        self.emit( SIGNAL("stuffDropped") , lowestRow )

        event.accept()
1 голос
/ 30 ноября 2011

Вот скрипт PyQt, который демонстрирует два способа перехвата событий отбрасывания:

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = QtGui.QWidget(self)
        self.setCentralWidget(widget)
        layout = QtGui.QVBoxLayout(widget)
        self.listA = ListWidget(self)
        self.listB = QtGui.QListWidget(self)
        self.listB.viewport().installEventFilter(self)
        for widget in (self.listA, self.listB):
            widget.setAcceptDrops(True)
            widget.setDragEnabled(True)
            for item in 'One Two Three Four Five Six'.split():
                widget.addItem(item)
            layout.addWidget(widget)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.Drop and
            source is self.listB.viewport()):
            self.listB.dropEvent(event)
            if event.isAccepted():
                print 'eventFilter', self.listB.count()
            return True
        return QtGui.QMainWindow.eventFilter(self, source, event)

class ListWidget(QtGui.QListWidget):
    def __init__(self, parent):
        QtGui.QListWidget.__init__(self, parent)

    def dropEvent(self, event):
        QtGui.QListWidget.dropEvent(self, event)
        if event.isAccepted():
            print 'dropEvent', self.count()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
1 голос
/ 30 ноября 2011

Событие, которое вы слушаете: QDropEvent. Чтобы выполнить работу по получению события, вам необходимо:

  • Переопределение QWidget::dropEvent на целевом виджете или
  • Используйте отдельный виджет контроллера в качестве фильтра событий для цели удаления (переопределите QObject::eventFilter на контроллере, а затем установите его на цель [installEventFilter]).

EDIT : углубление в глубину:

  1. Повторная реализация dropEvent

Заголовок:

cDropTarget : public QWidget
{
  Q_OBJECT

public:
  cDropTarget(QWidget *Parent = 0);

protected:
  virtual void dropEvent(QDropEvent *event);
}

Реализация:

cDropTarget::cDropTarget(QWidget *Parent)
  : QWidget(Parent)
{
  setAcceptDrops(true);
}

void cDropTarget::dropEvent(QDropEvent *event)
{
  //check that you want to process the drop event
  //i.e. its mimeData()->hasFormat(that you can interpret)

  //extract mimeData() from the drop event

  //do something with it
}
  1. Использование отдельного фильтра событий

Заголовок:

cDropEventFilter : public QObject
{
   ...

protected:
  virtual bool eventFilter(QObject *watched, QEvent *event);

   ...
}

Реализация:

bool cDropEventFilter::eventFilter(QObject *watched, QEvent *event)
{
  if(event->type() == QEvent::DropEnter)
  {
    QDropEvent *DropEvent = static_cast<QDropEvent*>(event);
    if (DropEvent->mimeData()->hasFormat(MIME_TYPE))
    {

      DropEvent->acceptProposedAction();
      return true;
    }
  }
  else
  {
    return QObject::eventFilter(watched, event);
  }

  //Handle all events not matching mimeData format MIME_TYPE
  event->ignore();
  return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...