Прокрутка перетаскиванием мышью в qt - PullRequest
0 голосов
/ 06 июня 2018

Я работаю в c ++ на qt 5.10.1, и у меня есть виджет, в который я динамически создаю дополнительные виджеты.

for(QString pics : nameVector) 
    {
        QIcon* buttonIcon = new QIcon;

        QImage image(QString("%1").arg(pics));  //QImage's Constructor takes a file path
        image.scaled(9000, scrollerHeight*7 , Qt::KeepAspectRatio, Qt::SmoothTransformation);

        QPixmap pixMap(QPixmap::fromImage(image).scaled(5000, scrollerHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation)); //8 will do it once scrollbar is removed.;
        buttonIcon->addPixmap(QPixmap::fromImage(image).scaled(5000, scrollerHeight * m_scaleFactor, Qt::KeepAspectRatio, Qt::SmoothTransformation));

        QPushButton *pixButton = new QPushButton;

        pixButton->setIconSize(imageSize);
        pixButton->setIcon(*buttonIcon);
        pixButton->setObjectName(pics + "button");
        ui.horizontalLayout_2->addWidget(pixButton); //addButton


        QObject::connect(&pixButton, &pixButton->clicked(true),
            &ui.tempOutputLabel, &fileFinder(pics);
        }

область прокрутки в виджете увеличивается по горизонтали с каждым новым добавлением -это делается с помощью qts «горизонтальная политика: расширение» в конструкторе qt.

Теперь у меня есть полоса прокрутки, но я хочу переместить мышь (желательно, удерживая правую кнопку мыши)) и перетаскивание изображений - как прокрутка на телефоне.

Я начал с добавления событий перемещения мыши и кнопок мыши

void JobPreviewWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)  //najdeme najblizsi obrazok
        ;
    if (event->button() == Qt::RightButton)
    {
        QPointF m_rightEnd = event->pos();
        m_offset += m_rightEnd - m_rightStart;
    }
}

void JobPreviewWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::RightButton)
    {
        m_rightStart = event->pos();
    }
}

void JobPreviewWidget::mouseMoveEvent(QMouseEvent *event)
{
    m_mousePoint = event->pos();
    repaint(); //this is the problem for me
}

Я не знаю, как сделать перекрашиваемый горизонтальный макетсо смещением m_offset.Любые указатели приветствуются.

...