Содержимое виджета QScrollArea повышено до QWidget - PullRequest
4 голосов
/ 05 июня 2010

Прежде всего, спасибо, что уделили время на чтение моего вопроса.

Я создал свой собственный Qt Widget (родитель QWidget), и у меня есть QImage "inside" для манипулирования изображениями. У меня проблема в следующем: когда я продвигаю содержимое QScrollArea (QDesigner) в мой виджет, функции прокрутки не работают; У меня нет полосы прокрутки, или я не вижу результатов, когда использую метод «sureVisible (..)».

Подскажите, пожалуйста, нужно ли перегрузить или переопределить какой-либо метод в моем собственном виджете.

С уважением и заранее спасибо, Оскар.


Код: намерение - использовать непосредственно myWidget (продвигая его в QDesigner), и я не использую напрямую QImage, потому что я хочу сохранить некоторые дополнительные данные в виджете.

struct myData
{
    QImage myImage;
};

myWidget::myWidget(QWidget* parent, Qt::WFlags fl) : QWidget(parent, fl)
{
    myData = new myData();
}

myWidget::~myWidget()
{
    delete myData;
}

void myWidget::init(QImage image)
{
    try
    {
        myData->myImage = image;
        resize(myData->myImage->width, myData->myImage->height);
    }
    catch(...)
    {
        QString msg("myWidget::init return error\n");
        qWarning(msg.toLatin1().data());
        return;
    }
}

QSize myWidget::minimumSize() const {
    return myData->myImage.size();
}

QSize myWidget::sizeHint() const {
    return myData->myImage.size();
}

void myWidget::paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    painter.drawImage(myData->myImage.rect(), myData->myImage);
}

void myWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        emit mousePress(event->x(), event->y());
    }
}

void myWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::RightButton) {
        emit mouseMove(event->x(), event->y());
    }
}

1 Ответ

1 голос
/ 05 июня 2010

У меня было что-то подобное несколько раз, и это может сбивать с толку правильную передачу всех сигналов. Сначала взгляните на Пример просмотра изображений . Это, вероятно, ответит на большинство ваших вопросов. Есть два ключевых раздела, на которые стоит обратить внимание. Первый - это масштабирующий код -

 void ImageViewer::scaleImage(double factor)
 {
     Q_ASSERT(imageLabel->pixmap());
     scaleFactor *= factor;
     imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());

     adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
     adjustScrollBar(scrollArea->verticalScrollBar(), factor);

     zoomInAct->setEnabled(scaleFactor < 3.0);
     zoomOutAct->setEnabled(scaleFactor > 0.333);
 }

Затем необходимо настроить полосы прокрутки. Этот код -

     void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor)
 {
     scrollBar->setValue(int(factor * scrollBar->value()
                             + ((factor - 1) * scrollBar->pageStep()/2)));
 }

Я обнаружил, что этот пример кода решил около 75% моих проблем при попытке чего-либо с изображением внутри области прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...