├── LICENSE
├── README.md
└── ShadowDesigner
├── ShadowDesigner.pro
├── main.cpp
├── res.qrc
├── shadowfactory.cpp
├── shadowfactory.h
├── style.qss
├── visualizationview.cpp
├── visualizationview.h
├── widget.cpp
├── widget.h
└── widget.ui
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 eiilpux17@163.com
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ShadowDesigner
2 | Tool for testing qt private shadow API parameters
3 |
4 | Preview:
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ShadowDesigner/ShadowDesigner.pro:
--------------------------------------------------------------------------------
1 | QT += core gui
2 |
3 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
4 |
5 | CONFIG += c++11
6 |
7 | # You can make your code fail to compile if it uses deprecated APIs.
8 | # In order to do so, uncomment the following line.
9 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
10 |
11 | SOURCES += \
12 | main.cpp \
13 | shadowfactory.cpp \
14 | visualizationview.cpp \
15 | widget.cpp
16 |
17 | HEADERS += \
18 | shadowfactory.h \
19 | visualizationview.h \
20 | widget.h
21 |
22 | FORMS += \
23 | widget.ui
24 |
25 | # Default rules for deployment.
26 | qnx: target.path = /tmp/$${TARGET}/bin
27 | else: unix:!android: target.path = /opt/$${TARGET}/bin
28 | !isEmpty(target.path): INSTALLS += target
29 |
30 | RESOURCES += \
31 | res.qrc
32 |
--------------------------------------------------------------------------------
/ShadowDesigner/main.cpp:
--------------------------------------------------------------------------------
1 | #include "widget.h"
2 |
3 | #include
4 | #include
5 |
6 | int main(int argc, char *argv[])
7 | {
8 | QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
9 | QGuiApplication::setAttribute(Qt::AA_Use96Dpi);
10 | QApplication a(argc, argv);
11 | a.setStyleSheet("file:///:/style.qss");
12 | Widget w;
13 | w.show();
14 | return a.exec();
15 | }
16 |
--------------------------------------------------------------------------------
/ShadowDesigner/res.qrc:
--------------------------------------------------------------------------------
1 |
2 |
3 | style.qss
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ShadowDesigner/shadowfactory.cpp:
--------------------------------------------------------------------------------
1 | #include "shadowfactory.h"
2 | #include
3 | #include
4 |
5 | QT_BEGIN_NAMESPACE
6 | extern void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0);
7 | QT_END_NAMESPACE
8 |
9 | QImage ShadowFactory::createShadow(const QPainterPath &path, qreal radius, const QColor &shadowColor, const QColor &fillColor, qreal devicePixelRatio)
10 | {
11 | // 参考rect,支持任意路径
12 | return QImage();
13 | }
14 |
15 | QImage ShadowFactory::createShadow(const QRect &rect, qreal radius, const QColor &shadowColor, const QColor &fillColor, qreal devicePixelRatio)
16 | {
17 | const int _radius = qCeil(radius);
18 | const qreal ratio = devicePixelRatio;
19 | QRect targetRect = rect.adjusted(0, 0, _radius, _radius);
20 | QSize imageSize = QSize(targetRect.right() + 1, targetRect.bottom() + 1) * ratio; //始终假设左侧有足够的空间,以右侧为准
21 |
22 | QImage source(imageSize, QImage::Format_ARGB32_Premultiplied);
23 | source.setDevicePixelRatio(ratio);
24 | source.fill(0);
25 | QPainter painter(&source);
26 | painter.setPen(Qt::NoPen);
27 | painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
28 | painter.setBrush(shadowColor);
29 | painter.drawRect(rect);
30 | painter.end();
31 |
32 | source.setDevicePixelRatio(1.0);
33 |
34 | //模糊图像
35 | QImage target(imageSize, QImage::Format_ARGB32_Premultiplied);
36 | target.fill(0);
37 | if(radius > 0)
38 | {
39 | QPainter blurPainter(&target);
40 | blurPainter.setRenderHint(QPainter::Antialiasing);
41 | qt_blurImage(&blurPainter, source, radius * ratio, false, true);
42 | blurPainter.end();
43 | }
44 | target.setDevicePixelRatio(ratio);
45 |
46 | //上一步操作会使中心区域模糊,重新填充
47 | painter.begin(&target);
48 | painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
49 | painter.fillRect(target.rect(), shadowColor);
50 | painter.setCompositionMode(QPainter::CompositionMode_Source);
51 | painter.setPen(Qt::NoPen);
52 | painter.setBrush(fillColor.isValid() ? fillColor : shadowColor);
53 | painter.drawRect(rect);
54 | painter.end();
55 | return target;
56 | }
57 |
58 | QImage ShadowFactory::createShadow(const QSize &baseSize, qreal radius, const QColor &shadowColor, const QColor &fillColor, qreal devicePixelRatio)
59 | {
60 | if(baseSize.isValid())
61 | {
62 | QRect rect(QPoint(0, 0), baseSize);
63 | const int _radius = qCeil(radius);
64 | rect.moveTopLeft(QPoint(_radius, _radius));
65 | return createShadow(rect, radius, shadowColor, fillColor, devicePixelRatio);
66 | }
67 | return QImage();
68 | }
69 |
70 | QImage ShadowFactory::createInsideShadow(const QSize &baseSize, qreal radius, const QColor &shadowColor, const QColor &fillColor, qreal devicePixelRatio)
71 | {
72 | if(baseSize.isValid())
73 | {
74 | const int _radius = qCeil(radius);
75 | const qreal ratio = devicePixelRatio;
76 | const int _border = _radius * 2;
77 | QRect rect(_border, _border, baseSize.width(), baseSize.height());
78 | QSize imageSize = QSize(rect.right() + _border + 1, rect.bottom() + _border + 1) * ratio;
79 |
80 | QImage source(imageSize, QImage::Format_ARGB32_Premultiplied);
81 | source.setDevicePixelRatio(ratio);
82 | source.fill(QColor(0,0,0,255));
83 | QPainter painter(&source);
84 | painter.setPen(Qt::NoPen);
85 | painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
86 | painter.setBrush(shadowColor);
87 | painter.setCompositionMode(QPainter::CompositionMode_Clear);
88 | painter.drawRect(rect);
89 | painter.end();
90 |
91 | source.setDevicePixelRatio(1.0);
92 |
93 | //模糊图像
94 | QImage target(imageSize, QImage::Format_ARGB32_Premultiplied);
95 | target.fill(0);
96 | if(radius > 0)
97 | {
98 | QPainter blurPainter(&target);
99 | blurPainter.setRenderHint(QPainter::Antialiasing);
100 | qt_blurImage(&blurPainter, source, radius * ratio, false, true);
101 |
102 | blurPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
103 | blurPainter.fillRect(target.rect(), shadowColor);
104 | blurPainter.end();
105 | }
106 | target.setDevicePixelRatio(ratio);
107 |
108 | QImage result(baseSize * ratio, QImage::Format_ARGB32_Premultiplied);
109 | result.fill(fillColor);
110 | painter.begin(&result);
111 | painter.drawImage(QPoint(0, 0), target, rect);
112 | painter.end();
113 | return result;
114 | }
115 | return QImage();
116 | }
117 |
--------------------------------------------------------------------------------
/ShadowDesigner/shadowfactory.h:
--------------------------------------------------------------------------------
1 | #ifndef SHADOWFACTORY_H
2 | #define SHADOWFACTORY_H
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | class ShadowFactory
9 | {
10 | public:
11 | static QImage createShadow(const QPainterPath &path, qreal radius, const QColor &shadowColor, const QColor &fillColor = QColor(), qreal devicePixelRatio = 1.0);
12 | static QImage createShadow(const QRect &rect, qreal radius, const QColor &shadowColor, const QColor &fillColor = QColor(), qreal devicePixelRatio = 1.0);
13 | static QImage createShadow(const QSize &baseSize, qreal radius, const QColor &shadowColor, const QColor &fillColor = QColor(), qreal devicePixelRatio = 1.0);
14 | static QImage createInsideShadow(const QSize &baseSize, qreal radius, const QColor &shadowColor, const QColor &fillColor = QColor(), qreal devicePixelRatio = 1.0);
15 | };
16 |
17 | #endif // SHADOWFACTORY_H
18 |
--------------------------------------------------------------------------------
/ShadowDesigner/style.qss:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ShadowDesigner/visualizationview.cpp:
--------------------------------------------------------------------------------
1 | #include "visualizationview.h"
2 |
3 | #include "shadowfactory.h"
4 | #include
5 | #include
6 | #include
7 |
8 | VisualizationView::VisualizationView(QWidget *parent)
9 | : QWidget(parent)
10 | {
11 | }
12 |
13 | void VisualizationView::setBackground(const QColor &color)
14 | {
15 | if(color.isValid())
16 | {
17 | this->backgroundColor = color;
18 | tryUpdate();
19 | }
20 | }
21 |
22 | void VisualizationView::setFillColor(const QColor &color)
23 | {
24 | if(color.isValid())
25 | {
26 | this->fillColor = color;
27 | tryUpdate();
28 | }
29 | }
30 |
31 | void VisualizationView::setShadowColor(const QColor &color)
32 | {
33 | if(color.isValid())
34 | {
35 | this->shadowColor = color;
36 | tryUpdate();
37 | }
38 | }
39 |
40 | void VisualizationView::setShadowRadius(int radius)
41 | {
42 | if(radius > 0 && this->shadowRadius != radius)
43 | {
44 | this->shadowRadius = radius;
45 | if(this->isVisible())
46 | {
47 | update();
48 | }
49 | }
50 | }
51 |
52 | void VisualizationView::setTestSize(const QSize &size)
53 | {
54 | this->testSize = size;
55 | update();
56 | }
57 |
58 | void VisualizationView::setShowGrid(bool show)
59 | {
60 | if(showGrid != show)
61 | {
62 | showGrid = show;
63 | tryUpdate();
64 | }
65 | }
66 |
67 | void VisualizationView::setInsiderShadow(bool inside)
68 | {
69 | if(insideShadow != inside)
70 | {
71 | insideShadow = inside;
72 | tryUpdate();
73 | }
74 | }
75 |
76 | void VisualizationView::paintEvent(QPaintEvent *event)
77 | {
78 | QRect rect = this->rect();
79 | QPainter painter(this);
80 | painter.fillRect(rect, backgroundColor);
81 |
82 | QRect shadowBaseRect = QRect(QPoint(0, 0), this->testSize);
83 | shadowBaseRect.moveCenter(rect.center());
84 |
85 | if(showGrid)
86 | {
87 | QPen pen(QColor(0xBDBDBD), 1);
88 | pen.setCosmetic(true);
89 | painter.setPen(pen);
90 | QRectF baseRect = shadowBaseRect;
91 | int shadowOffset = insideShadow ? shadowRadius : -shadowRadius;
92 | painter.drawLine(QPointF(baseRect.x(), rect.top()),
93 | QPointF(baseRect.x(), rect.bottom()));
94 |
95 | painter.drawLine(QPointF(baseRect.x() + shadowOffset, rect.top()),
96 | QPointF(baseRect.x() + shadowOffset, rect.bottom()));
97 |
98 | painter.drawLine(QPointF(baseRect.right() - 0.5, rect.top()),
99 | QPointF(baseRect.right() - 0.5, rect.bottom()));
100 |
101 | painter.drawLine(QPointF(baseRect.right() - 0.5 - shadowOffset, rect.top()),
102 | QPointF(baseRect.right() - 0.5 - shadowOffset, rect.bottom()));
103 |
104 | painter.drawLine(QPointF(rect.left(), baseRect.top()),
105 | QPointF(rect.right(), baseRect.top()));
106 |
107 | painter.drawLine(QPointF(rect.left(), baseRect.top() + shadowOffset),
108 | QPointF(rect.right(), baseRect.top() + shadowOffset));
109 |
110 | painter.drawLine(QPointF(rect.left(), baseRect.bottom() - 0.5),
111 | QPointF(rect.right(), baseRect.bottom() - 0.5));
112 |
113 | painter.drawLine(QPointF(rect.left(), baseRect.bottom() - 0.5 - shadowOffset),
114 | QPointF(rect.right(), baseRect.bottom() - 0.5 - shadowOffset));
115 | }
116 |
117 | if(shadowRadius >= 0)
118 | {
119 | // 可以对缓存下来,size变化时再重新生成新的。
120 | if(insideShadow)
121 | {
122 | QImage image = ShadowFactory::createInsideShadow(this->testSize, this->shadowRadius, this->shadowColor, this->fillColor, this->devicePixelRatioF());
123 | painter.drawImage(shadowBaseRect.topLeft(), image);
124 | }
125 | else
126 | {
127 | QImage image = ShadowFactory::createShadow(this->testSize, this->shadowRadius, this->shadowColor, this->fillColor, this->devicePixelRatioF());
128 | QPoint diff(this->shadowRadius, this->shadowRadius);
129 | painter.drawImage(shadowBaseRect.topLeft() - diff, image);
130 | }
131 | }
132 | }
133 |
--------------------------------------------------------------------------------
/ShadowDesigner/visualizationview.h:
--------------------------------------------------------------------------------
1 | #ifndef VISUALIZATIONVIEW_H
2 | #define VISUALIZATIONVIEW_H
3 |
4 | #include
5 |
6 | class VisualizationView : public QWidget
7 | {
8 | Q_OBJECT
9 | public:
10 | explicit VisualizationView(QWidget *parent = nullptr);
11 |
12 | void setBackground(const QColor & color);
13 | void setFillColor(const QColor & color);
14 | void setShadowColor(const QColor & color);
15 | void setShadowRadius(int radius);
16 | void setTestSize(const QSize & size);
17 | void setShowGrid(bool show);
18 | void setInsiderShadow(bool inside);
19 |
20 | protected:
21 | void paintEvent(QPaintEvent *event);
22 | private:
23 | inline void tryUpdate(){
24 | if(this->isVisible()){
25 | update();
26 | }
27 | }
28 |
29 | private:
30 | QColor backgroundColor = Qt::white;
31 | QColor fillColor = QColor(0x36C7A7);
32 | QColor shadowColor = Qt::black;
33 | int shadowRadius = 20;
34 | QSize testSize;
35 | bool showGrid = false;
36 | bool insideShadow = false;
37 | };
38 |
39 | #endif // VISUALIZATIONVIEW_H
40 |
--------------------------------------------------------------------------------
/ShadowDesigner/widget.cpp:
--------------------------------------------------------------------------------
1 | #include "widget.h"
2 | #include "ui_widget.h"
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | Widget::Widget(QWidget *parent)
9 | : QWidget(parent)
10 | , ui(new Ui::Widget)
11 | {
12 | ui->setupUi(this);
13 | ui->fillColorEdit->setStyleSheet(" ");
14 | ui->areaWithBox->setValue(300);
15 | ui->areaHeightBox->setValue(200);
16 | ui->fillColorEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("[a-fA-F0-9]{0,8}"), ui->fillColorEdit));
17 | ui->fillColorEdit->setText("36C7A7");
18 |
19 |
20 | ui->shadowRadiusBox->setValue(20);
21 | ui->shadowColorEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("[a-fA-F0-9]{0,8}"), ui->shadowColorEdit));
22 | ui->shadowColorEdit->setText("000000");
23 | ui->backgroundEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("[a-fA-F0-9]{0,8}"), ui->shadowColorEdit));
24 | ui->backgroundEdit->setText("ffffff");
25 |
26 | connect(ui->areaWithBox, SIGNAL(valueChanged(int)), this, SLOT(updateShadow()));
27 | connect(ui->areaHeightBox, SIGNAL(valueChanged(int)), this, SLOT(updateShadow()));
28 | connect(ui->fillColorEdit, SIGNAL(textChanged(QString)), this, SLOT(updateShadow()));
29 | connect(ui->shadowRadiusBox, SIGNAL(valueChanged(int)), this, SLOT(updateShadow()));
30 | connect(ui->shadowColorEdit, SIGNAL(textChanged(QString)), this, SLOT(updateShadow()));
31 |
32 | connect(ui->pickFillColorButton, SIGNAL(clicked(bool)), this, SLOT(pickFillColor()));
33 | connect(ui->pickShadowColorButton, SIGNAL(clicked(bool)), this, SLOT(pickShadowColor()));
34 | connect(ui->pickBackgroundButton, SIGNAL(clicked(bool)), this, SLOT(pickBackground()));
35 |
36 | connect(ui->showGridBox, &QCheckBox::stateChanged, [this](){
37 | ui->shadowVisualization->setShowGrid(ui->showGridBox->isChecked());
38 | });
39 |
40 | connect(ui->insideShadowBox, &QCheckBox::stateChanged, [this](){
41 | ui->shadowVisualization->setInsiderShadow(ui->insideShadowBox->isChecked());
42 | });
43 |
44 | QTimer::singleShot(0, this, SLOT(updateShadow()));
45 | }
46 |
47 | Widget::~Widget()
48 | {
49 | delete ui;
50 | }
51 |
52 | void Widget::updateShadow()
53 | {
54 | int w = ui->areaWithBox->value();
55 | int h = ui->areaHeightBox->value();
56 | ui->shadowVisualization->setTestSize(QSize(w, h));
57 |
58 | QColor fillColor("#" + ui->fillColorEdit->text());
59 | ui->shadowVisualization->setFillColor(fillColor);
60 |
61 | ui->shadowVisualization->setShadowRadius(ui->shadowRadiusBox->value());
62 |
63 | QColor shadow("#" + ui->shadowColorEdit->text());
64 | ui->shadowVisualization->setShadowColor(shadow);
65 |
66 | QColor background("#" + ui->backgroundEdit->text());
67 | ui->shadowVisualization->setBackground(background);
68 | }
69 |
70 | void Widget::pickFillColor()
71 | {
72 | QColor color("#" + ui->fillColorEdit->text());
73 | if(!color.isValid()){
74 | color = Qt::white;
75 | }
76 | QColor picked = pickColor(color);
77 | if(picked.isValid()){
78 | ui->fillColorEdit->blockSignals(true);
79 | ui->fillColorEdit->setText(picked.name().mid(1));
80 | ui->fillColorEdit->blockSignals(false);
81 | updateShadow();
82 | }
83 | }
84 |
85 | void Widget::pickShadowColor()
86 | {
87 | QColor color("#" + ui->shadowColorEdit->text());
88 | if(!color.isValid()){
89 | color = Qt::black;
90 | }
91 | QColor picked = pickColor(color);
92 | if(picked.isValid()){
93 | ui->shadowColorEdit->blockSignals(true);
94 | ui->shadowColorEdit->setText(picked.name().mid(1));
95 | ui->shadowColorEdit->blockSignals(false);
96 | updateShadow();
97 | }
98 | }
99 |
100 | void Widget::pickBackground()
101 | {
102 | QColor color("#" + ui->backgroundEdit->text());
103 | if(!color.isValid()){
104 | color = Qt::black;
105 | }
106 | QColor picked = pickColor(color);
107 | if(picked.isValid()){
108 | ui->backgroundEdit->blockSignals(true);
109 | ui->backgroundEdit->setText(picked.name().mid(1));
110 | ui->backgroundEdit->blockSignals(false);
111 | updateShadow();
112 | }
113 | }
114 |
115 | QColor Widget::pickColor(const QColor &init)
116 | {
117 | QColorDialog dialog(init, this);
118 | dialog.adjustSize();
119 | if(dialog.exec() == QDialog::Accepted)
120 | {
121 | return dialog.selectedColor();
122 | }
123 | return QColor();
124 | }
125 |
126 |
--------------------------------------------------------------------------------
/ShadowDesigner/widget.h:
--------------------------------------------------------------------------------
1 | #ifndef WIDGET_H
2 | #define WIDGET_H
3 |
4 | #include
5 |
6 | QT_BEGIN_NAMESPACE
7 | namespace Ui { class Widget; }
8 | QT_END_NAMESPACE
9 |
10 | class Widget : public QWidget
11 | {
12 | Q_OBJECT
13 |
14 | public:
15 | Widget(QWidget *parent = nullptr);
16 | ~Widget();
17 |
18 | private slots:
19 | void updateShadow();
20 | void pickFillColor();
21 | void pickShadowColor();
22 | void pickBackground();
23 | QColor pickColor(const QColor & init);
24 | private:
25 | Ui::Widget *ui;
26 | };
27 | #endif // WIDGET_H
28 |
--------------------------------------------------------------------------------
/ShadowDesigner/widget.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | Widget
4 |
5 |
6 |
7 | 0
8 | 0
9 | 798
10 | 657
11 |
12 |
13 |
14 | Widget
15 |
16 |
17 | -
18 |
19 |
20 |
21 | 400
22 | 400
23 |
24 |
25 |
26 |
27 | -
28 |
29 |
30 | QFrame::StyledPanel
31 |
32 |
33 | QFrame::Raised
34 |
35 |
36 |
37 | 20
38 |
39 |
40 | 10
41 |
42 |
43 | 10
44 |
45 |
46 | 10
47 |
48 |
49 | 10
50 |
51 |
-
52 |
53 |
54 | 区域参数
55 |
56 |
57 |
-
58 |
59 |
60 | 宽度:
61 |
62 |
63 |
64 | -
65 |
66 |
67 | 1024
68 |
69 |
70 |
71 | -
72 |
73 |
74 | 高度:
75 |
76 |
77 |
78 | -
79 |
80 |
81 | 1024
82 |
83 |
84 |
85 | -
86 |
87 |
88 | 填充颜色:
89 |
90 |
91 |
92 | -
93 |
94 |
95 | 3
96 |
97 |
-
98 |
99 |
100 | #
101 |
102 |
103 |
104 | -
105 |
106 |
107 |
108 | 100
109 | 16777215
110 |
111 |
112 |
113 | 8
114 |
115 |
116 |
117 | -
118 |
119 |
120 | Pick color
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 | -
133 |
134 |
135 | 阴影参数
136 |
137 |
138 |
-
139 |
140 |
141 | -
142 |
143 |
144 | 3
145 |
146 |
-
147 |
148 |
149 | #
150 |
151 |
152 |
153 | -
154 |
155 |
156 |
157 | 100
158 | 16777215
159 |
160 |
161 |
162 | 8
163 |
164 |
165 |
166 | -
167 |
168 |
169 | Pick color
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 | -
179 |
180 |
181 | 阴影半径:
182 |
183 |
184 |
185 | -
186 |
187 |
188 | 阴影颜色:
189 |
190 |
191 |
192 | -
193 |
194 |
195 |
196 |
197 |
198 |
199 | -
200 |
201 |
202 | 内阴影:
203 |
204 |
205 |
206 |
207 |
208 |
209 | -
210 |
211 |
212 | 其他
213 |
214 |
215 |
-
216 |
217 |
218 | 预览背景:
219 |
220 |
221 |
222 | -
223 |
224 |
225 | 3
226 |
227 |
-
228 |
229 |
230 | #
231 |
232 |
233 |
234 | -
235 |
236 |
237 |
238 | 100
239 | 16777215
240 |
241 |
242 |
243 |
244 | -
245 |
246 |
247 | Pick color
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 | -
257 |
258 |
259 |
260 |
261 |
262 |
263 | -
264 |
265 |
266 | 显示网格:
267 |
268 |
269 |
270 |
271 |
272 |
273 | -
274 |
275 |
276 | Qt::Vertical
277 |
278 |
279 |
280 | 20
281 | 40
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 | VisualizationView
294 | QWidget
295 |
296 | 1
297 |
298 |
299 |
300 |
301 |
302 |
--------------------------------------------------------------------------------