首先,感谢您抽出时间阅读我的问题。
我创建了自己的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());
}
}
答案 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%的问题。