# 在 Qt 开发中遇到了想给一些控件归类至一个框框内
# 存在多个需求,所以就重写了一个
# 设定了三种尺寸,PW_SAMLL PW_MEDIUM PM_LARGE,有不同的边框大小、标题大小
# 效果如下
PW_SMALL
PW_MEDIUM
PW_LARGE
.h
#ifndef PWIDGET_H
#define PWIDGET_H
#include <QWidget>
#include <QLayout>
#include <QLabel>
enum{
PW_SMALL = 0,
PW_MEDIUM = 1,
PW_LARGE = 2
};
class PWidget : public QWidget
{
Q_OBJECT
public:
explicit PWidget(QWidget *parent = nullptr,
int PW_MODE = 0,
QLayout *layout = nullptr);
void setTitle(QString title);
private:
/** StyleSheet **/
QString main_label_style_basic = "QLabel{color: #696969;"
"font-family:微软雅黑;"
"background:#FFFFFF;"
"border:none;";
QString main_label_style_small = "font-size:12px}";
QString main_label_style_medium = "font-size:15px}";
QString main_label_style_large = "font-size:20px}";
QString main_label_style;
QString main_widget_style_small = "border:1px solid grey;border-radius:2px;";
QString main_widget_style_medium = "border:1px solid grey;border-radius:5px;";
QString main_widget_style_large = "border:1px solid grey;border-radius:10px;";
QString main_widget_style;
/** Values**/
QWidget *parent;
int PW_MODE;
int main_label_move_small = 15;
int main_label_move_medium = 20;
int main_label_move_large = 25;
int main_label_move;
/** Layout**/
QLayout *layout;
/** Widgets**/
QWidget *mainWidget;
QLabel *mainLabel;
/** Functions **/
void setMode();
void initLayout();
};
#endif // PWIDGET_H
.cpp
#pragma execution_character_set("utf-8")
#include "pwidget.h"
PWidget::PWidget(QWidget *parent,
int PW_MODE,
QLayout *layout) : QWidget(parent)
{
this->parent = parent;
this->PW_MODE = PW_MODE;
this->layout = layout;
setMode();
initLayout();
}
// 根据PW_MODE设置相应的变量
void PWidget::setMode(){
if(PW_MODE == PW_SMALL){
main_label_style = main_label_style_basic + main_label_style_small;
main_label_move = main_label_move_small;
main_widget_style = main_widget_style_small;
}
else if(PW_MODE == PW_MEDIUM){
main_label_style = main_label_style_basic + main_label_style_medium;
main_label_move = main_label_move_medium;
main_widget_style = main_widget_style_medium;
}
else if(PW_MODE == PW_LARGE){
main_label_style = main_label_style_basic + main_label_style_large;
main_label_move = main_label_move_large;
main_widget_style = main_widget_style_large;
}
else{
main_label_style = main_label_style_basic + main_label_style_small;
main_label_move = main_label_move_small;
main_widget_style = main_widget_style_small;
}
}
// 初始化布局
void PWidget::initLayout(){
mainLabel = new QLabel(this);
mainLabel->setStyleSheet(main_label_style);
mainWidget = new QWidget(this);
mainWidget->setStyleSheet(main_widget_style);
mainWidget->setLayout(layout);
mainLabel->move(main_label_move + 5, 0);
mainWidget->move(5, main_label_move / 2);
mainWidget->setFixedWidth(parent->width() - 10);
mainLabel->setText(" 无标题 ");
mainWidget->raise();
mainLabel->raise();
}
// 设置标题
void PWidget::setTitle(QString title){
mainLabel->setText(" " + title + " ");
}
调用
#include "pwidget.h"
PWidget *widget = new PWidget(this, PW_LARGE, mainLayout);
widget->setTitle("PW_LARGE");