gpt4 book ai didi

c++ - QScrollArea 小部件内容提升为 QWidget

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:12 25 4
gpt4 key购买 nike

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

我创建了自己的 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());
}
}

最佳答案

我遇到过几次这样的事情,让所有信号都正确可能会让人感到困惑。首先,看一下 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% 的问题,当我尝试使用滚动区域内的图像进行任何操作时。

关于c++ - QScrollArea 小部件内容提升为 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com