我尝试修改此示例代码(http://doc.qt.digia.com/4.6/widgets-scribble.html),以便在尺寸过大时滚动图像。
基本上这是一个创建类似mspaint的程序的代码(我的代码几乎与教程完全相同,除了我更改了类名):
class ImageDisplay : public QWidget
{
Q_OBJECT
public:
ImageDisplay(QWidget *parent = 0);
~ImageDisplay();
void LoadImage(QString img);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
private:
bool modified;
bool scribbling;
int myPenWidth;
QColor myPenColor;
QImage svgImage;
QPoint lastPoint;
private:
void ResizeImage(QImage *image, const QSize &newSize);
void DrawLineTo(const QPoint &endPoint);
};
将自定义窗口小部件附加到滚动区域的代码
...
scrollArea = new QScrollArea(centralWidget);
scrollArea->setWidgetResizable(true);
myImageDisplay = new ImageDisplay();
myImageDisplay->setGeometry(QRect(0, 0, 780, 559));
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
myImageDisplay->setSizePolicy(sizePolicy);
myImageDisplay->setMinimumSize(QSize(0, 0));
scrollArea->setWidget(myImageDisplay);
gridLayout->addWidget(scrollArea, 0, 0, 1, 1);
...
我将自定义小部件放在scrollarea中,但滚动条永远不会出现。当我调试它时,小部件的大小不能大于srollarea。
我已经阅读过一个小部件大小的地方;可以扩展到大于容器大小,或者说,我不太明白。
我找到了一个不雅的解决方案,似乎是“黑客”,我将小部件的最小尺寸设置为图像的大小,我把代码放在加载图像中
void ImageDisplay::LoadImage(QString img)
{
QImage loadedImage;
loadedImage.load(img);
QSize newSize = loadedImage.size().expandedTo(size());
ResizeImage(&loadedImage, newSize);
svgImage = loadedImage;
modified = false;
update();
// "hack" code
this->setMinimumHeight(newSize.height());
this->setMinimumWidth(newSize.width());
}
答案 0 :(得分:1)
这不是一个“黑客”。这就是它应该是的样子。如果您希望窗口小部件永远不会小于它显示的图像,那么这就是您所做的;你告诉它它永远不应该比图像小。但是在您的代码中,您已经指定它可以小于其内容:
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
这意味着小部件更喜欢具有适合其容器可见区域的大小,即使这意味着它的内容被切断了。
更优雅的方法是使用此代替:
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
这将告诉布局永远不要尝试调整窗口小部件的大小。您在加载图像时设置了一个大小,除非您自己手动调整大小,否则它将保持该大小。
话虽如此,也许您应该考虑使用QLabel而不是自定义QWidget类。 QLabel已经设置为显示图像,我相信它本身应该知道它的大小。