Шаг 123.
Библиотека Qt.
Реализация drop

    На этом шаге рассмотрим реализацию drop.

    На рис. 1 показан виджет, способный принимать сбрасываемые в него объекты (в данном случае — файлы). После сбрасывания виджет отображает полное имя файла.


Рис.1. Виджет, принимающий сбрасываемые объекты

    Ниже представлено определение класса Drag:

class Drop : public QLabel {
Q_OBJECT
protected:
//Метод dragEnterEvent() вызывается каждый раз, когда перетаскиваемые объекты
//пересекают границу виджета. В этом методе виджет сообщает о готовности 
//или неготовности принимать перетаскиваемые объекты, при этом указатель мыши
//из перечеркнутого круга превращается в стрелку с прямоугольником,
//в противном случае внешний вид указателя остается без изменений
    virtual void dragEnterEvent(QDragEnterEvent* pe)
    {
        //С помощью метода hasFormat() необходимо проверять на совместимость
        //тип данных перетаскиваемых объектов
        if (pe->mimeData()->hasFormat("text/uri-list")) {
            //Вызов метода acceptProposedAction() объекта события QDragEnterEvent
            //сообщает о готовности виджета принять перетаскиваемый объект
            pe->acceptProposedAction();
        }
    }
//Метод dropEvent() вызывается при сбрасывании перетаскиваемых объектов
//в пределах окна виджета, что происходит в момент отпускания левой кнопки мыши
    virtual void dropEvent(QDropEvent* pe)
    {
        //Вызов метода urls() объекта класса QMimeData возвращает 
        //список файлов в переменную urlList
        QList<QUrl> urlList = pe->mimeData()->urls();
        QString     str;
        foreach(QUrl url, urlList) {
            //В цикле foreach вызовом метода QUrl::toString() извлекаются строки,
            //которые объединяются в одну
            str +="<font color=blue size=3><b>"+ url.toString() + "</b></font><br>";
        }
        //Полученная строка отображается методом setText()
        setText("<Font color=green size=3>Принято:</font><br>" + str);
    }
public:
    Drop(QWidget* pwgt = 0) : QLabel("<font color=red size=10><b>Бросай сюда
                                      </b></font>", pwgt)
    {
//В конструкторе класса Drop осуществляется вызов метода setAcceptDrops(),
//в который передается значение true, для того чтобы виджет был в состоянии
//принимать сбрасываемые объекты
        setAcceptDrops(true);
    }
};

    Файлы приложения можно взять здесь.

    Класс QDragEnterEvent унаследован от класса QDragMoveEvent (см. рис. 1 шаг 111). Этот класс предоставляет методы accept() и ignore(), которыми можно воспользоваться для разрешения (или запрета) приема перетаскиваемых объектов. В эти методы можно передавать объекты класса QRect. С их помощью можно ограничить размеры принимающей области в самом виджете. Чтобы разрешить, например, сбрасывание объектов во всей области виджета, можно сделать следующий вызов: accept(rect()).

    На следующем шаге рассмотрим создание собственных типов перетаскивания.




Предыдущий шаг Содержание Следующий шаг