c++ - Qt 滚动条不会出现在自定义小部件上

标签 c++ qt

我尝试修改此示例代码 ( 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。

我在某处读到小部件的大小不能扩展到大于容器大小,或者有点,我不太明白。

我发现了一个不优雅的解决方案,它似乎是“hack”,我将小部件的最小尺寸设置为图像的尺寸,我将代码放在加载图像中

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());
}

最佳答案

这并不是真正的“hack”。这就是应该的样子。如果您希望小部件永远不会小于它显示的图像,那么您就是这样做的;你告诉它它永远不应该让自己小于图像。但是在您的代码中,您已指定它可以小于其内容:

QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

这意味着小部件将更喜欢具有适合其容器可见区域的大小,即使这意味着其内容被切断。

不过,更优雅的方法是改用它:

QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

这将告诉布局永远不要尝试调整小部件的大小。您在加载图像时设置了一个尺寸,除非您手动调整尺寸,否则它将保持该尺寸。

话虽如此,也许您应该考虑使用 QLabel 而不是自定义 QWidget 类。 QLabel 已经设置为显示图像,我相信它自己知道它应该是什么尺寸。

关于c++ - Qt 滚动条不会出现在自定义小部件上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17028507/

相关文章:

C++ Hook 成员函数和原始函数返回垃圾值。

c++ - 这些(bCondition == NULL)和(NULL==bCondition)有什么区别?

c++ - 工具栏上的透明图标绘制难看的边框

qt - 在QT中将字节数组保存为.png/.jpg文件

qt - 在 QTableView 中显示行中所有单元格的编辑器

c++ - 连接 qradiobutton 和 qtab 小部件时出现问题

c++ - 通过类内类提升进程间共享内存

C++使用定界符将txt中的数据存储到变量中

c++ - 如何使用enable_if定义不同的成员函数?

c++ - Qt : Error while compiling Qt 5.0.1 on Windows, Visual Studio 2010 (VS2010)