Skip to content

Commit

Permalink
feat: 增加自定义流式布局控件
Browse files Browse the repository at this point in the history
  • Loading branch information
mhduiy committed Sep 29, 2023
1 parent f017aa4 commit 67d586b
Show file tree
Hide file tree
Showing 6 changed files with 191 additions and 29 deletions.
30 changes: 27 additions & 3 deletions src/fastApp/FastAppItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,17 +165,41 @@ void FastAppItem::paintEvent(QPaintEvent *event) {

// 绘制图标框

QRect imageBorderRect = rect().marginsRemoved(QMargins(25, 10, 25, 40));
// painter.setPen(Qt::red);
QRect imageBorderRect = rect().marginsRemoved(QMargins(25, 25, 25, 25));
painter.drawPixmap(imageBorderRect, QPixmap(":/bilibiliData.png"));
// painter.drawRoundedRect(imageBorderRect, 5, 5);

// 绘制类型

painter.setBrush(Qt::white);
painter.setPen(Qt::NoPen);
QRect appTypeRect = QRect(rect().topLeft() + QPoint(8, 8), QSize(30, 15));
painter.drawRoundedRect(appTypeRect, 5, 5);

{
// 绘制类型文字
painter.setPen(Qt::black);
QFont font;
font.setPixelSize(10);
painter.setFont(font);
QTextOption titleTextOption;
QString text = "DBUS";
titleTextOption.setAlignment(Qt::AlignCenter);
titleTextOption.setWrapMode(QTextOption::WrapAnywhere);
painter.drawText(appTypeRect, text, titleTextOption);
}



// 绘制文字部分
painter.setPen(Qt::black);
QFont font;
font.setPixelSize(12);
painter.setFont(font);
QTextOption titleTextOption;
QString text = "腾讯QQ";
QRect titleRect = rect().marginsRemoved(QMargins(5,70,5,5));
QString text = "打开系统代理";
QRect titleRect = rect().marginsRemoved(QMargins(5,80,5,5));
titleTextOption.setAlignment(Qt::AlignCenter);
titleTextOption.setWrapMode(QTextOption::WrapAnywhere);
painter.drawText(titleRect, text, titleTextOption);
Expand Down
50 changes: 50 additions & 0 deletions src/fastApp/FlowLayoutWidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include "FlowLayoutWidget.h"
#include <QResizeEvent>
#include <QDebug>

FlowLayoutWidget::FlowLayoutWidget(QWidget *parent)
:QScrollArea(parent)
,m_contentLayout(new DFlowLayout())
,m_contentWidget(new QWidget())
,m_mainLayout(new QHBoxLayout())
,m_mainWidget(new QWidget())
{
initUI();
}

void FlowLayoutWidget::initUI()
{
// setAutoFillBackground(true);
m_mainLayout->setAlignment(Qt::AlignHCenter);

m_mainLayout->addWidget(m_contentWidget);

m_contentWidget->setLayout(m_contentLayout);

m_contentLayout->setHorizontalSpacing(10);
m_contentLayout->setVerticalSpacing(10);

m_mainWidget->setLayout(m_mainLayout);

// m_mainWidget->setAttribute(Qt::WA_TranslucentBackground);
setWidget(m_mainWidget);
setAttribute(Qt::WA_TranslucentBackground);
setAttribute(Qt::WA_StyledBackground);

setStyleSheet("*{background-color: transparent;}");
}

void FlowLayoutWidget::addItem(QWidget *item)
{
m_contentLayout->addWidget(item);
}

void FlowLayoutWidget::resizeEvent(QResizeEvent *event)
{
int maxHorCount = (event->size().width() - m_contentLayout->horizontalSpacing()) / (m_itemWidth + m_contentLayout->horizontalSpacing());
int curContentWidth = maxHorCount * m_itemWidth + (maxHorCount + 1) * m_contentLayout->horizontalSpacing();
m_contentWidget->setFixedWidth(curContentWidth);
m_contentWidget->setFixedHeight(m_contentLayout->heightForWidth(curContentWidth));
m_mainWidget->setFixedSize(event->size().width(), m_contentWidget->height());
QScrollArea::resizeEvent(event);
}
30 changes: 30 additions & 0 deletions src/fastApp/FlowLayoutWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef FLOWLAYOUTWIDGET_H
#define FLOWLAYOUTWIDGET_H

#include <QWidget>
#include <QScrollArea>
#include <dflowlayout.h>

DWIDGET_USE_NAMESPACE

class FlowLayoutWidget : public QScrollArea
{
Q_OBJECT
public:
explicit FlowLayoutWidget(QWidget *parent = nullptr);
void addItem(QWidget *item);
void initUI();
void setItemWidth(int width);

protected:
void resizeEvent(QResizeEvent *event) override;

private:
DFlowLayout *m_contentLayout = nullptr;
QWidget *m_contentWidget = nullptr;
QWidget *m_mainWidget = nullptr;
QHBoxLayout *m_mainLayout = nullptr;
int m_itemWidth = 110;
};

#endif
94 changes: 70 additions & 24 deletions src/fastApp/fastAppWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,78 @@
#include <qpushbutton.h>
#include "FastAppItem.h"

FastAppWidget::FastAppWidget(QWidget *parent) : QWidget(parent){
auto *mainLayout = new QHBoxLayout(this);
m_fastAppItems.append(new FastAppItem);
m_fastAppItems.append(new FastAppItem);
m_fastAppItems.append(new FastAppItem);
m_fastAppItems.append(new FastAppItem);
FastAppWidget::FastAppWidget(QWidget *parent)
:QWidget(parent)
,m_editFastAppBtn(new DFloatingButton(DStyle::SP_EditElement, this))
,m_addFastAppBtn(new DFloatingButton(DStyle::SP_IncreaseElement, this))
{
auto *mainLayout = new QVBoxLayout(this);
m_mainWidget = new FlowLayoutWidget(this);
for(int i = 0; i < 100; i++) {
m_fastAppItems.append(new FastAppItem);
}


for(auto item : m_fastAppItems) {
mainLayout->addWidget(item);
m_mainWidget->addItem(item);
}
editBtn = new DSuggestButton();
mainLayout->addWidget(editBtn);

connect(editBtn, &QPushButton::clicked, this, [this](){
static bool isShow = false;
if(isShow) {
for(auto item : m_fastAppItems) {
item->hideOperatorBtn();
}
isShow = false;

mainLayout->addWidget(m_mainWidget);

// mainLayout->addLayout(main1);
// mainLayout->addLayout(main2);
// mainLayout->addLayout(main3);
// mainLayout->addWidget(m_editFastAppBtn);
// mainLayout->addWidget(m_addFastAppBtn);

m_editFastAppBtn->raise();
m_addFastAppBtn->raise();

connect(m_editFastAppBtn, &DFloatingButton::clicked, this, &FastAppWidget::onEditFastAppBtnClicked);
connect(m_addFastAppBtn, &DFloatingButton::clicked, this, &FastAppWidget::onAddFastAppBtnClicked);

}


void FastAppWidget::resizeEvent(QResizeEvent *event)
{
m_editFastAppBtn->move(this->geometry().width() - m_editFastAppBtn->width() - 10, this->geometry().height() - m_editFastAppBtn->height() - 10);
m_addFastAppBtn->move(this->geometry().width() - m_editFastAppBtn->width() * 2 - 20, this->geometry().height() - m_editFastAppBtn->height() - 10);
QWidget::resizeEvent(event);
}

void FastAppWidget::showEvent(QShowEvent *event)
{
static bool isFirstShow = true;
QWidget::showEvent(event);
if(!isFirstShow) {
return;
}
isFirstShow = false;
m_editFastAppBtn->move(this->geometry().width() - m_editFastAppBtn->width() - 10, this->geometry().height() - m_editFastAppBtn->height() - 10);
m_addFastAppBtn->move(this->geometry().width() - m_editFastAppBtn->width() * 2 - 20, this->geometry().height() - m_editFastAppBtn->height() - 10);
}

void FastAppWidget::onEditFastAppBtnClicked()
{
static bool isShow = false;
if(isShow) {
for(auto item : m_fastAppItems) {
item->hideOperatorBtn();
}
else {
for(auto item : m_fastAppItems) {
item->showOperatorBtn();
}
isShow = true;
m_editFastAppBtn->setIcon(DStyle::StandardPixmap::SP_EditElement);
isShow = false;
}
else {
for(auto item : m_fastAppItems) {
item->showOperatorBtn();
}

});
m_editFastAppBtn->setIcon(DStyle::StandardPixmap::SP_MarkElement);
isShow = true;
}
}

void FastAppWidget::onAddFastAppBtnClicked()
{

}
14 changes: 13 additions & 1 deletion src/fastApp/fastAppWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,27 @@
#include <QVector>
#include <DSuggestButton>
#include <dsuggestbutton.h>
#include <DFloatingButton>
#include "FlowLayoutWidget.h"

class FastAppWidget : public QWidget{
Q_OBJECT
public:
explicit FastAppWidget(QWidget *parent = nullptr);

protected:
void resizeEvent(QResizeEvent *event) override;
void showEvent(QShowEvent *event) override;

private:
void onAddFastAppBtnClicked();
void onEditFastAppBtnClicked();

private:
QVector<FastAppItem*> m_fastAppItems;
DSuggestButton *editBtn;
DFloatingButton *m_editFastAppBtn;
DFloatingButton *m_addFastAppBtn;
FlowLayoutWidget *m_mainWidget = nullptr;
};


Expand Down
2 changes: 1 addition & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ int main(int argc, char *argv[])
globalSetting::getInstance(&a); // 创建设置类对象

MainWindow w;
w.resize(650,500);
w.resize(700,500);

// 移动到中间位置
QDesktopWidget *desktop=QApplication::desktop();
Expand Down

0 comments on commit 67d586b

Please sign in to comment.