Russian Qt Forum
Июнь 01, 2024, 21:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Обработчики drag & drop для виджетов, сделанных в дизайнере  (Прочитано 3007 раз)
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« : Апрель 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" на высоту панели инструментов. Как лучше привести их к общей системе?
« Последнее редактирование: Апрель 10, 2013, 16:37 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #1 : Апрель 09, 2013, 18:19 »

как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #2 : Апрель 09, 2013, 18:36 »

как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.
неточно выразился - подменить обработчики.
Цитировать
координаты приводи через mapToGlobal.
этот вариант я имел в виду, хотелось более изящное решение.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #3 : Апрель 09, 2013, 18:55 »

1) Надо посмотреть, возможно ли словить евенты драг анд дропа фильтрами. Но это всё равно будет топорнее, чем наследование.
2) mapTo - изящный вариант, предоставленный разработчиками Qt. Лучше ты не сделаешь Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #4 : Апрель 09, 2013, 19:04 »

как можно что-то перегрузить без наследования? в плюсах нету method swizzling, если только не заниматься извращениями на ассебмлере наверное.
неточно выразился - подменить обработчики.
это и назвыается method swizzling
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #5 : Апрель 10, 2013, 16:36 »

2) mapTo - изящный вариант, предоставленный разработчиками Qt. Лучше ты не сделаешь Веселый
Не очень-то это красиво, ну пусть  Улыбающийся:
Код:
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 поправил условие.
« Последнее редактирование: Апрель 11, 2013, 19:53 от sergek » Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 19.