Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] работа с мышью, перетаскивание обьектов 
:(
    Опции темы
IKM2007
Дата 2.12.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Доброго дня. Хочу "привязать" виджеты к курсору мыши. Пытаюсь сделать так, но не получается. 
Код

QWidget* wgt = new QWidget;
wgt->setMouseTracking(true);
...

QWidget* wgt1 = new QWidget(wgt);
...

QMouseEvent* event;
wgt1->mouseMoveEvent(event);//выдает ошибку о том, что mousePressEvent protected.
wgt1->move(event->pos());

Кто-нибудь может привести простой пример? Заранее спасибо.



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
chaos
Дата 2.12.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



IKM2007, смотри %QT_HOME%\examples\draganddrop
PM WWW   Вверх
IKM2007
Дата 2.12.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Изучаю проект с перетаскиванием иконок. По ходу вопрос не совсем по теме. В коде встречается следующее:

Цитата

//! [1]


//! [2]
    ...
//! [2]
        
//! [3]
...
//! [3]

Почему следующие строки синего цвета, а не зеленого. Посмотрел, это не триграф, но определенно какой-то смысл ведь должен иметь?


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
andrew_121
Дата 2.12.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(IKM2007 @  2.12.2009,  18:04 Найти цитируемый пост)
wgt1->mouseMoveEvent(event);//выдает ошибку о том, что mousePressEvent protected.

Естественно. Ты же пытаешься использовать протектед метод. Унаследуйся от QWidget, и перегрузи его. А проще - QObject::installEventFilter()

Добавлено через 3 минуты и 25 секунд
Цитата(IKM2007 @  2.12.2009,  20:28 Найти цитируемый пост)
Почему следующие строки синего цвета, а не зеленого.

Думается мне...что подсветка синтаксиса настроена у вас так smile 

Цитата(IKM2007 @  2.12.2009,  20:28 Найти цитируемый пост)
какой-то смысл ведь должен иметь?

Конечно. Если читать туториал, то там все по шагам расписано. Хотя, хз сколько лет тот туториал не обновлялся ;)
Еще из этого понятно какие строки являются частью шага.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
IKM2007
Дата 2.12.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 2
Всего: 40



Давайте рассмотрим эту функцию, остальное уже будет понятно. Вопросы написал в коде в виде комментов.
Код

void DragWidget::mousePressEvent(QMouseEvent *event)
{
    QLabel *child = static_cast<QLabel*>(childAt(event->pos()));
    if (!child)
        return;

    QPixmap pixmap = *child->pixmap();

   
//создается блок памяти, в которой записывается картинка и позиция нового рисунка? 
//Если да, то почему именно эти данные? Что других данных нету?
 QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    dataStream << pixmap << QPoint(event->pos() - child->pos());

//Это как я понимаю тоже блок памяти? Для "тени" виджета во время перемещения?
    QMimeData *mimeData = new QMimeData;
    mimeData->setData("application/x-dnditemdata", itemData);//здесь что за первый параметр?

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->setPixmap(pixmap);
    drag->setHotSpot(event->pos() - child->pos());


    QPixmap tempPixmap = pixmap;
    QPainter painter;
    painter.begin(&tempPixmap);
    painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
    painter.end();

    child->setPixmap(tempPixmap);

    if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)
        child->close();
    else {
        child->show();
        child->setPixmap(pixmap);
    }
}


Если не трудно в общих словах обьясните те части кода, где я оставил комменты.



Это сообщение отредактировал(а) IKM2007 - 2.12.2009, 21:34


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
gmorgunov
Дата 2.12.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: нет
Всего: 5



Пример "привязки" виджета к мыши(если правильно понял):
Код

#include <QtGui>

class Window : public QLabel {   
private:
    QPoint  position;

protected:
    void mousePressEvent(QMouseEvent* event)
    {
        position = event->pos();
    }

    void mouseMoveEvent(QMouseEvent* event)
    {
        move(event->globalPos() - position);
    }

public:
    Window(QWidget* p = 0) : QLabel(p)
    {
    }
};

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Window       win ;
    QPixmap      pix("photo.png");
    win.setPixmap(pix);
    win.setMask(pix.mask());
    win.show();
    return app.exec();
}



Это сообщение отредактировал(а) gmorgunov - 2.12.2009, 21:47
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1119 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.