<QT基础(2)>QScrollArea使用笔记

项目需要设置单个检查的序列图像预览窗口,采用QScrollArea中加入QWidget窗口,每个窗口里面用Qlabel实现图像预览。
过程涉及两部分内容

  • 引入QWidget
    • 引入label
    • 插入图像(resize)
  • 引入布局

组织

scrollArea内部自带Qwidget,后续的控件添加和layout都是在QWidget内部。
在这里插入图片描述

代码

这一过程的主要步骤是向QScrollArea内添加预览窗口的方案,首先图像的展示使用的是将QLabel的PixelMap与图像映射实现的,本文重点要做的是把QLabel放到QScollArea内,实现按照给定数量添加指定数量的QLabel,用于后续PixelMap的映射。为了方便实现,QLabel被置入QWidget中,放入Layout组织起来给传递过去。

这里在网上发现了一个很巧妙的实现,他做了一个QWidget的派生类ScrollableWidget,在派生类内构造子控件组织要添加的QLabel,然后直接调用QScrollArea的addwidget把一整个ScrollableWidget加入到界面中。这和我的应用很契合,每次Load新的序列需要把当前工作区的所有数据清除,包括预览窗口,然后重新构造。这样构造预览窗口可以直接删除当前QScrollArea的ScrollableWidget,然后根据当前Load的数据构造新的ScrollableWidget。

#include <QtWidgets>

class ScrollableWidget : public QWidget {
public:
    ScrollableWidget(int numWidgets) {
        QVBoxLayout *layout = new QVBoxLayout(this);
        for (int i = 0; i < numWidgets; ++i) {
            QWidget *widget = new QWidget;
            QLabel *label = new QLabel(QString("Label %1").arg(i));
            QVBoxLayout *widgetLayout = new QVBoxLayout(widget);
            widgetLayout->addWidget(label);
            layout->addWidget(widget);
        }
    }
};

class MainWindow : public QWidget {
public:
    MainWindow() {
        QScrollArea *scrollArea = new QScrollArea;
        ScrollableWidget *scrollableWidget = new ScrollableWidget(10);
        scrollArea->setWidgetResizable(true);
        scrollArea->setWidget(scrollableWidget);

        QVBoxLayout *mainLayout = new QVBoxLayout(this);
        mainLayout->addWidget(scrollArea);
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow window;
    window.setGeometry(100, 100, 400, 400);
    window.show();
    return app.exec();
}

这个应该是解决序列文件读取比较好的方式,每次读取只需要把scrollableWidget delete就好了,由对象树机制直接剔除所有的子控件,在新的Load中重新构造scrollableWidget并导入即可。

测试项目

输入20个Label
在这里插入图片描述
删除20个并输入10个
在这里插入图片描述
代码:

#pragma once

#include <QtWidgets/QMainWindow>
#include <QtWidgets>
#include "ui_dcmimgpro.h"

class DcmImgPro : public QMainWindow
{
    Q_OBJECT

public:
    DcmImgPro(QWidget *parent = nullptr);
    ~DcmImgPro();

private:
    Ui::DcmImgProClass ui;
private slots:
    void pushbtn();
    void lineEditset();
private:
    int l_num = 15;
};

class ScrollableWidget:public QWidget
{
public:
    ScrollableWidget(int numWidgets)
    {
        QVBoxLayout* layout = new QVBoxLayout(this);
        for (int i = 0; i < numWidgets; i++)
        {
            QWidget* widget = new QWidget;
            QString msg = "Label_" + QString::number(i);
            QLabel* label = new QLabel(msg);
            QVBoxLayout* widgetlayout = new QVBoxLayout(widget);
            widgetlayout->addWidget(label);
            layout->addWidget(widget);
        }
    };

};
#include "dcmimgpro.h"

DcmImgPro::DcmImgPro(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    ui.scrollArea->setWidgetResizable(true);
    ScrollableWidget* scrollableWidget = new  ScrollableWidget(l_num);
    ui.scrollArea->setWidget(scrollableWidget);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(pushbtn()));
    connect(ui.lineEdit, SIGNAL(returnPressed()), this, SLOT(lineEditset()));

}

void DcmImgPro::pushbtn()
{
    ui.scrollArea->setWidget(nullptr);
    ScrollableWidget* scrollableWidget = new  ScrollableWidget(l_num);
    ui.scrollArea->setWidget(scrollableWidget);
}

void DcmImgPro::lineEditset()
{
    l_num = ui.lineEdit->text().toInt();

}
DcmImgPro::~DcmImgPro()
{
 
}

相关推荐

  1. qt QScrollArea 可滚动区域控件简单举例

    2024-03-28 15:48:04       26 阅读
  2. QT学习笔记2--QT简述

    2024-03-28 15:48:04       52 阅读
  3. Qt基础-QDialog对话框使用

    2024-03-28 15:48:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 15:48:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 15:48:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 15:48:04       87 阅读
  4. Python语言-面向对象

    2024-03-28 15:48:04       96 阅读

热门阅读

  1. python内置函数 V

    2024-03-28 15:48:04       43 阅读
  2. Python:语法糖

    2024-03-28 15:48:04       39 阅读
  3. 本地项目提交到远程服务器的git流程

    2024-03-28 15:48:04       44 阅读
  4. Day32 贪心算法 part02

    2024-03-28 15:48:04       46 阅读
  5. ip地址开发场景问题

    2024-03-28 15:48:04       45 阅读
  6. 安全点安全区的通俗理解

    2024-03-28 15:48:04       42 阅读
  7. Chrome安装Vue插件vue-devtools

    2024-03-28 15:48:04       48 阅读
  8. 学习Dive into Deep learning:2.2 数据预处理,pandas

    2024-03-28 15:48:04       40 阅读
  9. 【晴问算法】算法初步—散列—整数出现次数

    2024-03-28 15:48:04       40 阅读
  10. Linux-跨节点免密登录

    2024-03-28 15:48:04       42 阅读
  11. 2990: 【C3】【递推】蟠桃记

    2024-03-28 15:48:04       43 阅读
  12. SQL:求同时在线人数问题

    2024-03-28 15:48:04       41 阅读
  13. Vue 3 关于组件的注册

    2024-03-28 15:48:04       44 阅读