Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sergek от Апрель 09, 2013, 13:45



Название: [РЕШЕНО]Обработчики drag & drop для виджетов, сделанных в дизайнере
Отправлено: sergek от Апрель 09, 2013, 13:45
Коллеги, помогите, пожалуста, по вопросам, связанным с drag&drop.
Перетаскиваю файлы из проводника на один из виджетов главной формы программы. Форма сконструирована в дизайнере. Приемником файлов сделал главную форму (т.к. не знаю, как ответить на 1-й вопрос ниже):
Код:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);
    setAcceptDrops(true);
}
Обработчики drag стандартные:
Код:
void MainWindow::dragEnterEvent(QDragEnterEvent * event){
    if (event->mimeData()->hasUrls())
        event->acceptProposedAction();
    else
        event->ignore();
}
Разрешаю перетаскивание для ограниченной области (одного из виджетов tabWidget):
Код:
void MainWindow::dragMoveEvent(QDragMoveEvent * event){
    bool inside=event->answerRect().intersects(tabWidget->geometry());
    if (event->mimeData()->hasUrls() && inside)
        event->acceptProposedAction();
    else
        event->ignore();
}

Вопросы следующие:
1) Можно ли перегрузить обработчики dragEnterEvent, dragMoveEvent, dropEvent для виджетов, сделанных в дизайнере, т.е. не создавая производного класса виджета?
2) В обработчике dragMoveEvent координаты курсора >answerRect(), как я понял, даются в системе координат принимающего виджета, а для главной формы отсчет по оси "y" начинается от верхнего края (т.е. от нижнего края заголовка формы).
Координаты дочерних виджетов geometry() даются в системе координат centralWidget(), отличающиеся по оси "y" на высоту панели инструментов. Как лучше привести их к общей системе?


Название: Re: Обработчики drag & drop для виджетов в дизайнере
Отправлено: kambala от Апрель 09, 2013, 18:19
как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.

координаты приводи через mapToGlobal.


Название: Re: Обработчики drag & drop для виджетов в дизайнере
Отправлено: sergek от Апрель 09, 2013, 18:36
как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.
неточно выразился - подменить обработчики.
Цитировать
координаты приводи через mapToGlobal.
этот вариант я имел в виду, хотелось более изящное решение.


Название: Re: Обработчики drag & drop для виджетов, сделанных в дизайнере
Отправлено: Bepec от Апрель 09, 2013, 18:55
1) Надо посмотреть, возможно ли словить евенты драг анд дропа фильтрами. Но это всё равно будет топорнее, чем наследование.
2) mapTo - изящный вариант, предоставленный разработчиками Qt. Лучше ты не сделаешь :D


Название: Re: Обработчики drag & drop для виджетов, сделанных в дизайнере
Отправлено: kambala от Апрель 09, 2013, 19:04
как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.
неточно выразился - подменить обработчики.
это и назвыается method swizzling


Название: Re: Обработчики drag & drop для виджетов, сделанных в дизайнере
Отправлено: sergek от Апрель 10, 2013, 16:36
2) mapTo - изящный вариант, предоставленный разработчиками Qt. Лучше ты не сделаешь :D
Не очень-то это красиво, ну пусть  :):
Код:
void MainWindow::dragMoveEvent(QDragEnterEvent *event){
    QPoint dragCursor=mapToGlobal(event->pos());
    QPoint topLeft=tabWidget->mapToGlobal(QPoint());
    QRect table(topLeft,topLeft+QPoint(tabWidget->width(),tabWidget->height()));

    if (event->mimeData()->hasUrls() && table.contains(dragCursor)) {
        event->acceptProposedAction();
    } else {
        event->ignore();
    }
}
11.04.2013 поправил условие.