代码之家  ›  专栏  ›  技术社区  ›  osanchezmon

QScrollArea小部件内容升级为QWidget

  •  4
  • osanchezmon  · 技术社区  · 15 年前

    首先,谢谢你花时间阅读我的问题。

    我创建了自己的Qt小部件(QWidget的父部件),并在“内部”有一个QImage来处理图像。我遇到的问题如下:当我将QScrollArea(QDesigner)的内容升级到我的小部件时,滚动特性不起作用;我没有任何滚动条,或者当我使用“ensurevible(…)”方法时看不到任何结果。

    请告诉我,如果我需要超载或覆盖任何方法在我自己的小部件。

    奥斯卡。


    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 回复  |  直到 15 年前
        1
  •  1
  •   photo_tom    15 年前

    Image Viewer Example . 它可能会回答你的大部分问题。有两个关键部分要看。首先是缩放代码-

     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%的问题。