<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。

cpp 复制代码
#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个

代码:

cpp 复制代码
#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);
        }
    };

};
cpp 复制代码
#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()
{
 
}
相关推荐
野猪亨利6676 分钟前
Qt day1
开发语言·数据库·qt
本就一无所有 何惧重新开始24 分钟前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki13727 分钟前
qt day1
开发语言·数据库·qt
流星白龙35 分钟前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风336636 分钟前
HTTPS是如何确保安全的
网络·数据库
CryptoPP1 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
koo3641 小时前
李宏毅机器学习笔记17
人工智能·笔记·机器学习
aramae2 小时前
数据结构与算法(递归)
开发语言·经验分享·笔记·算法
程序员大雄学编程2 小时前
「深度学习笔记1」深度学习全面解析:从基本概念到未来趋势
人工智能·笔记·深度学习
聪明的笨猪猪2 小时前
Java 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试