QT缩放后调整大小问题

发布于 2024-11-15 03:13:05 字数 1161 浏览 2 评论 0 原文

我正在尝试使用 QT 和 C++ 放大图片。

我在类中继承了 QLabel 对象来显示图片。并且还将这个 QLabels 放在 mdiarea 中。

缩放功能工作正常,但 qlabel 不会立即更新其大小。如果我尝试手动(使用光标)调整大小,程序会自动处理它并根据我的意愿调整 qlabel 的大小。

我怎样才能立即更新尺寸。

感谢您的帮助。 :)

bool MdiChild::event ( QEvent * e ){
    //qDebug("asd1");
if(e->type() == QEvent::Wheel){
    int numDegrees = ((QWheelEvent*) e)->delta() / 8;
    double numSteps = (double)numDegrees/150;
    int w = pix->width();
    int h = pix->height();
    ratio += numSteps;
    qDebug("ratio = %f", ratio);
    QPixmap* p = new QPixmap(pix->scaledToHeight ( (int)(h * ratio),Qt::FastTransformation  ));
    setPixmap(*p);
    adjustSize();
    adjustSize();
    update();

}
return QWidget::event(e);

 } 

问题已解决,但我想我无法回答我自己的问题。 当我将相同的事件添加到父窗口时,问题就解决了。但是,当我最大化窗口时,内部对象也会收到事件并导致最大化窗口崩溃。

 bool ImageProcessor::event ( QEvent * e ){
if(e->type() == QEvent::Wheel){
    QList<QMdiSubWindow *> childList = ui.mdiArea->subWindowList();
    for(int i = 0; i<childList.count(); i++){
        childList[i]->adjustSize();
    }
}
return QWidget::event(e);

}

I'm trying to zoom in a picture using QT and C++.

I inherited QLabel objects in my classes to show pictures. And also put this QLabels in mdiarea.

zoom function is working fine however the qlabel does not update its size immediately. If I try to resize is manually (with cursor) program automatically handles it and resize the qlabel as I wish.

How can I update the sizes immediately.

Thanks for help. :)

bool MdiChild::event ( QEvent * e ){
    //qDebug("asd1");
if(e->type() == QEvent::Wheel){
    int numDegrees = ((QWheelEvent*) e)->delta() / 8;
    double numSteps = (double)numDegrees/150;
    int w = pix->width();
    int h = pix->height();
    ratio += numSteps;
    qDebug("ratio = %f", ratio);
    QPixmap* p = new QPixmap(pix->scaledToHeight ( (int)(h * ratio),Qt::FastTransformation  ));
    setPixmap(*p);
    adjustSize();
    adjustSize();
    update();

}
return QWidget::event(e);

 } 

The problem is resolved but I think I cannot answer my own question.
When I add the same event to the parent window problem is solved. But when I maximize the window the inner object also got the event and crashes the maximized window.

 bool ImageProcessor::event ( QEvent * e ){
if(e->type() == QEvent::Wheel){
    QList<QMdiSubWindow *> childList = ui.mdiArea->subWindowList();
    for(int i = 0; i<childList.count(); i++){
        childList[i]->adjustSize();
    }
}
return QWidget::event(e);

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

遮云壑 2024-11-22 03:13:05

您需要一个QScrollArea来保存您的QLabel。否则,当窗口调整大小时,您的 QLabel 将没有有滚动条。

查看示例以了解如何创建图像查看器以及它们如何调整大小。

ImageViewer 示例

可缩放图片查看器

You need a QScrollArea to hold your QLabel. Otherwise when the window resizes your QLabel will not have scrollbars.

Look at the examples to see how to create an image viewer and how they resize.

ImageViewer example

Zoomable Picture Viewer

¢蛋碎的人ぎ生 2024-11-22 03:13:05

问题已解决,但我想我无法回答我自己的问题。当我将相同的事件添加到父窗口时,问题就解决了。但是,当我最大化窗口时,内部对象也会收到事件并导致最大化窗口崩溃。

bool ImageProcessor::event ( QEvent * e ){
if(e->type() == QEvent::Wheel){
    QList<QMdiSubWindow *> childList = ui.mdiArea->subWindowList();
    for(int i = 0; i<childList.count(); i++){
        childList[i]->adjustSize();
    }
}
return QWidget::event(e);
}

The problem is resolved but I think I cannot answer my own question. When I add the same event to the parent window problem is solved. But when I maximize the window the inner object also got the event and crashes the maximized window.

bool ImageProcessor::event ( QEvent * e ){
if(e->type() == QEvent::Wheel){
    QList<QMdiSubWindow *> childList = ui.mdiArea->subWindowList();
    for(int i = 0; i<childList.count(); i++){
        childList[i]->adjustSize();
    }
}
return QWidget::event(e);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文