#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; } } }