QScrollArea小部件内容提升为QWidget

时间:2010-06-05 09:58:23

标签: c++ qt

首先,感谢您抽出时间阅读我的问题。

我创建了自己的Qt Widget(QWidget的父级),并在内部有一个QImage来操作图像。我遇到的问题如下:当我将QScrollArea(QDesigner)的内容提升到我的小部件时,滚动功能不起作用;我没有任何滚动条,或者当我使用'ensureVisible(..)'方法时,我看不到任何结果。

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

提前问候并表示感谢, 奥斯卡。


代码:目的是直接使用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 个答案:

答案 0 :(得分:1)

我有几次这样的事情,让所有的信号正确得令人困惑。首先,看看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%的问题。