Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] работа с мышью


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

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

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

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

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

Автор: chaos 2.12.2009, 19:14
IKM2007, смотри %QT_HOME%\examples\draganddrop

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

Цитата

//! [1]


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

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

Автор: andrew_121 2.12.2009, 20:29
Цитата(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 Найти цитируемый пост)
какой-то смысл ведь должен иметь?

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

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

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);
    }
}


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


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

#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();
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)