• 软件系统配置UI(QT)


    #ifndef XCONFIGDLG_H
    #define XCONFIGDLG_H
    
    #include <QFrame>
    #include <QDialog>
    #include <QScrollArea>
    #include <QScrollBar>
    #include <QListWidget>
    #include <QVBoxLayout>
    #include <QGridLayout>
    #include <QList>
    #include <QLabel>
    #include <QCheckBox>
    
    
    class XConfigDlg : public QDialog
    {
        Q_OBJECT
    public:
        explicit XConfigDlg(QWidget *parent = nullptr);
    
    Q_SIGNALS:
    
    public Q_SLOTS:
    
        void slotOnItemClicked(QListWidgetItem *item);
    
        void onSlotScrollBarValueChanged(int value);
    
    private:
        QFrame *m_layoutWidget = nullptr;       //右侧Widget
        QStringList m_itemNameList;             //左侧QListWidget项目名称
        QVector<QWidget *> m_widgetList;        //右侧项目Widget集合
        QVector<int> m_widgetBottomYPos;        //右侧项目Widget底部Y坐标
        QListWidget *m_leftWidget = nullptr;    //左侧QListWidget
        QScrollArea *m_rightWidget = nullptr;   //右侧滚动区域
        QVBoxLayout *m_pContentVBoxLayout = nullptr;    //右侧m_layoutWidget的布局管理器
        int m_nWidgets = 30;
        void initCtrl();
    public:
    
    
    };
    
    #endif // XCONFIGDLG_H
    #include "xconfigdlg.h"
    #include <QDebug>
    #include <QRandomGenerator>
    
    
    XConfigDlg::XConfigDlg(QWidget *parent)
        : QDialog(parent)
    {
        setFixedSize(700, 480);
        initCtrl();
    }
    
    void XConfigDlg::initCtrl()
    {
        int leftWidth = 130;
        int rightWidth = width() - leftWidth;
        m_leftWidget = new QListWidget(this);
        m_leftWidget->setStyleSheet("QFrame{background-color:rgb(180,180,180)}");
        m_rightWidget = new QScrollArea(this);
        m_leftWidget->setGeometry(0, 0, 130, height());
        m_rightWidget->setGeometry(leftWidth, 0, rightWidth, height());
        for(int i = 0; i < m_nWidgets; i++){
            m_itemNameList << QString("item %1").arg(i+1);
        }
        m_layoutWidget = new QFrame(this);
        //为标签生成随机背景颜色
        QStringList styleSheets;
        for(int i = 0; i < m_nWidgets; i++){
            styleSheets << QString("QFrame{background-color:rgb(%1,%2,%3)}")
                              .arg(QRandomGenerator::global()->bounded(0,256))
                              .arg(QRandomGenerator::global()->bounded(0,256))
                              .arg(QRandomGenerator::global()->bounded(0,256));
        }
        m_pContentVBoxLayout = new QVBoxLayout(m_layoutWidget);
        m_pContentVBoxLayout->setContentsMargins(0,0,0,0);
        m_pContentVBoxLayout->setSpacing(0);
        int currentY = 0;
        for(int i = 0; i < m_itemNameList.size(); i++){
            QLabel *frame = new QLabel(m_itemNameList[i], m_layoutWidget);
            quint32 randHeight = QRandomGenerator::global()->bounded(30,300);
            frame->setFixedSize(rightWidth, randHeight);
            frame->setStyleSheet(styleSheets.at(i));
            m_widgetList.append(frame);
            m_pContentVBoxLayout->addWidget(frame);
            currentY += frame->height();
            m_widgetBottomYPos.push_back(currentY);
        }
    
        m_leftWidget->addItems(m_itemNameList);
        connect(m_leftWidget, &QListWidget::itemClicked, this, &XConfigDlg::slotOnItemClicked);
        m_leftWidget->setCurrentRow(0);
    
        m_rightWidget->setWidgetResizable(true);
        m_rightWidget->setWidget(m_layoutWidget);
        connect(m_rightWidget->verticalScrollBar(), &QScrollBar::valueChanged, this, &XConfigDlg::onSlotScrollBarValueChanged);
    }
    
    
    void XConfigDlg::slotOnItemClicked(QListWidgetItem *item)
    {
        int rowIndex = m_leftWidget->row(item);
        int bottomYPos = 0;
        if(rowIndex != 0){
            bottomYPos = m_widgetBottomYPos[rowIndex-1];
        }
        m_rightWidget->verticalScrollBar()->setValue(bottomYPos);
    }
    
    void XConfigDlg::onSlotScrollBarValueChanged(int value)
    {
        qDebug() << __FUNCTION__;
        int scrollYPos = value;
        qDebug() << "scrollYPos:" << scrollYPos;
        for(int i = 0; i < m_widgetBottomYPos.size(); i++){
            if(m_widgetBottomYPos[i] > scrollYPos){
                m_leftWidget->setCurrentRow(i);
                break;
            }
        }
    
    }
  • 相关阅读:
    socket注意
    PCM音频文件编码
    题外:分类篇(音乐风格分类)基于BP神经网络
    MFCC特征提取过程详解
    语音信号分析
    k-means聚类
    c++关键字详解
    vs中项目解决方案和项目的关系
    条件编译#ifdef 和#endif
    c++快捷键
  • 原文地址:https://www.cnblogs.com/endenvor/p/15785393.html
Copyright © 2020-2023  润新知