项目地址:https://github.com/btkrc/ViewImg


python的那个QT不是很好用,还是采用C++实现。

目前还是一个雏形,主要是市面上的图片查看器都不符合我的要求,没办法只有自己写一个

我还有很多别的事要做,可能会更新的很慢,逻辑代码在下面,QT的ui_*.h需要单独编译

环境: QT5.135.15.2 vs2019 QT VS TOOLS

遇到的问题

QPixmap在载入图片在QLabel上面显示不了,使用load()加载图片的返回值总是false。而在我把图片放入qrc资源中,加载又可以。比较了与load就正常的图片的区别是这张图片是24位深度的。
解决方案:先用QFile把文件的内容全部读取出来,然后再用loadData()来加载数据。
猜测可能原因:内存对齐后,用load函数载入的时候都是按照32位深度来载入。

修改后如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Practice::disPlayImage(QTreeWidgetItem *item) {
QString fileName = item->data(Practice::colItem, Qt::UserRole).toString();//读取节点信息,转换成字符串
QFile file(fileName);

bool isOk=file.open(QIODevice::ReadOnly);
if (isOk) {
/*不要直接载入文件,QPixmap在处理24位深的图片时会出错*/
QByteArray data = file.readAll();
currentPixmap.loadFromData(data);
if (currentPixmap.height() > currentPixmap.width())
onActZoomFitHTriggered();
else
onActZoomFitWTriggered();
}

新版qt foreach宏已经废弃,改用std的range for

This macro is used to implement Qt’s foreach loop. The variable parameter is a variable name or variable definition; the container parameter is a Qt container whose value type corresponds to the type of the variable. See The foreach Keyword for details.


源码

main.cpp

1
2
3
4
5
6
7
8
#include"viewImg.h"
#include<QApplication>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Practice w;
w.show();
return app.exec();
}

viewImg.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include"qmainwindow.h"
#include"ui_viewImg.h"
#include<QMessageBox>
#include<QLabel>
#include<QFileDialog>
#include<QDir>
#include<QFile>
#include<QIODevice>
#include<QMenu>
#include<QPoint>
#include<QMouseEvent>
#include<QResizeEvent>
class Practice:public QMainWindow {
Q_OBJECT
public:
Practice(QWidget *parent = nullptr);
~Practice();
private:
Ui::PracticeClass ui;
/*自定义TreeWIdgetItem的枚举类型必须大于1000,1000以内留给实现*/
enum treeItemType{itTopItem=1001,itGroupItem,itImageItem};
enum treeColumnNum{colItem,colItemType};
void iniUI();
void iniTree();
void addFolderItem(QTreeWidgetItem *parentItem, const QString &dirName);
void addImageItem(QTreeWidgetItem *parentItem, const QString &fileName);
void recursionTreeItem(QTreeWidgetItem *item);
void disPlayImage(QTreeWidgetItem *item);
bool checkTreeWidgetItem(QTreeWidgetItem *item);
QString getFinalFolderName(const QString &fullPathName) const;
void redrawPixmap(const QPixmap *pixmap);

QLabel *labFileName;
QPixmap currentPixmap;
QPoint mLastRelPos, newWindowPos;
bool isDraging;
double pixRatio;
private slots:
void onActAddFolderTriggered();
void onActAddFilesTriggered();
void onActDeleteItemTriggered();
void onActTraversalTriggered();
void onActZoomFitHTriggered();
void onActZoomFitWTriggered();
void onActZoomInTriggered();
void onActZoomOutTriggered();
void onActZoomRealSizeTriggered();
void onActDockVisibleToggled(bool arg1);
void onActDockFloatTriggered(bool checked);
void onDockWidgetVisibilityChanged(bool visible);
void onDockTopLevelChanged(bool topLevel);
void onTreeFilesCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void onTreeFilesCustomContextMenuRequired(QPoint pos);

protected:
void mousePressEvent(QMouseEvent *event)override;
void mouseMoveEvent(QMouseEvent *event)override;
void mouseReleaseEvent(QMouseEvent *event)override;
void resizeEvent(QResizeEvent *event)override;
};
//int welcome(QWidget *parent=nullptr);

viewImg.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#pragma warning(disable:26444)
#include"viewImg.h"

/*手动调用基类构造函数*/
Practice::Practice(QWidget *parent) :QMainWindow(parent) {
this->isDraging = false;

ui.setupUi(this);
iniUI();
iniTree();
}
Practice::~Practice() {
/*此label没有父对象,需要手动释放内存
如果new时指定了this为父亲,则this销毁时会自动执行QLabel的析构函数*/
delete labFileName;
}
void Practice::iniUI() {
setCentralWidget(ui.scrollArea);
setWindowIcon(QIcon(":/pics/vorctorIcon/favicon.ico"));
setWindowFlags(Qt::FramelessWindowHint);
//setWindowFlags(Qt::FramelessWindowHint);
ui.dockWidget->setWidget(ui.treeFiles);
labFileName = new QLabel("");
ui.statusbar->addWidget(labFileName);
ui.toolBar->setMovable(false);
ui.labDisplayPix->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
ui.labDisplayPix->setIndent(0);
ui.labDisplayPix->setAlignment(Qt::AlignCenter);
}
void Practice::iniTree() {
QString dataStr("");//使用直接构造,不使用拷贝构造
ui.treeFiles->clear();
QIcon icon;
icon.addFile(":/images/images/bird.jpg");
QTreeWidgetItem *item = new QTreeWidgetItem(Practice::itTopItem);
item->setIcon(Practice::colItem, icon);
item->setText(Practice::colItem, QStringLiteral("图片文件"));
item->setText(Practice::colItemType, "type=itTopItem");
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsAutoTristate);
item->setCheckState(Practice::colItem, Qt::Checked);
item->setData(Practice::colItem, Qt::UserRole, QVariant(dataStr));
ui.treeFiles->addTopLevelItem(item);
}
/*添加文件夹action槽函数*/
void Practice::onActAddFolderTriggered() {
if (!checkTreeWidgetItem(ui.treeFiles->currentItem()))return;
QString directory = QFileDialog::getExistingDirectory(this, QStringLiteral("先有鸿钧后有天,陆压道人还在前"));
if (!directory.isEmpty()) {
/*顶层节点和组节点添加group直接以当前项作为父节点*/
QTreeWidgetItem *parentItem = ui.treeFiles->currentItem();
/*防止没有选中项时执行添加函数,否则会触发异常*/
if (!parentItem) {
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("没有选中节点"), QMessageBox::Ok);
return;
}
addFolderItem(parentItem, directory);
}
}
void Practice::addFolderItem(QTreeWidgetItem *parentItem, const QString &dirName) {
QIcon icon(":/images/images/bird.jpg");
QString nodeText = getFinalFolderName(dirName);

/*添加组节点*/
QTreeWidgetItem *item = new QTreeWidgetItem(Practice::itGroupItem);
item->setIcon(Practice::colItem, icon);
item->setText(Practice::colItem, nodeText);
item->setText(Practice::colItemType, "type=itGroupItem");
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
item->setCheckState(Practice::colItem, Qt::Checked);
item->setData(Practice::colItem, Qt::UserRole, QVariant(dirName));

parentItem->addChild(item);

/*添加目录下的文件*/
QDir dir(dirName);
QStringList stringFilter("");
stringFilter << "*.jpg" << "*.png" << "*.webp" << "*.gif";
/*按名称排序*/
QStringList names = dir.entryList(stringFilter, QDir::Files | QDir::Readable, QDir::Name);
for(QString name:names) {
QTreeWidgetItem *imgItem = new QTreeWidgetItem(Practice::itImageItem);
imgItem->setIcon(Practice::colItem, icon);
imgItem->setText(Practice::colItem, name);
imgItem->setData(Practice::colItem, Qt::UserRole, dirName + "/" + name);
item->addChild(imgItem);

}

}
QString Practice::getFinalFolderName(const QString &fullPathName)const {
int count = fullPathName.size();
int i = fullPathName.lastIndexOf("/");
return fullPathName.right(count - i - 1);//注意返回引用的注意事项!
}
/*添加文件action槽函数*/
void Practice::onActAddFilesTriggered() {
/*触发action信号时如果当前项为空则直接返回*/
if (!checkTreeWidgetItem(ui.treeFiles->currentItem()))return;
QStringList files = QFileDialog::getOpenFileNames(this, QStringLiteral("选择一个或多个文件"), "", ("Images(*.jpg *.png)"));
if (files.isEmpty()) return;//stringList为空时直接返回
QTreeWidgetItem *parentItem, *item;
item = ui.treeFiles->currentItem();
/*如果当前节点是图片节点则设置其父节点,顶层节点和group直接以其自身作为父节点*/
if (item->type() == Practice::itImageItem)
parentItem = item->parent();
else
parentItem = item;
for (int i = 0; i < files.size(); ++i) {
addImageItem(parentItem, files[i]);
}
}
/*遍历所有节点*/
void Practice::onActTraversalTriggered() {
for (int i = 0; i < ui.treeFiles->topLevelItemCount(); ++i) {
QTreeWidgetItem *topItem = ui.treeFiles->topLevelItem(i);
recursionTreeItem(topItem);
}
}
/*功能函数,对节点遍历*/
void Practice::recursionTreeItem(QTreeWidgetItem *item) {
QString str = "*" + item->text(Practice::colItem);
item->setText(Practice::colItem, str);
if (item->childCount() > 0) {//如果项有子节点则进入递归
for (int i = 0; i < item->childCount(); ++i)
recursionTreeItem(item->child(i));
}
}
/*功能函数,添加图片节点*/
void Practice::addImageItem(QTreeWidgetItem *parentItem, const QString &fileName) {
QIcon icon(":/images/images/bird.jpg");
QString nodeText = getFinalFolderName(fileName);
QTreeWidgetItem *item = new QTreeWidgetItem(Practice::itImageItem);
item->setIcon(Practice::colItem, icon);
item->setText(Practice::colItem, nodeText);
item->setText(Practice::colItemType, "type=itImageItem");
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsAutoTristate);
item->setCheckState(Practice::colItem, Qt::Checked);
/*设置完整路径数据*/
item->setData(Practice::colItem, Qt::UserRole, fileName);
parentItem->addChild(item);//添加儿子项
}

/*item发生变化时的槽函数*/
void Practice::onTreeFilesCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) {
/*当前没有选中项时将直接返回*/
if (!current) {
return;
}
int itemType = current->type();
switch (itemType) {
case Practice::itTopItem:
ui.actAddFiles->setEnabled(true);
ui.actAddFolder->setEnabled(true);
ui.actDeleteItem->setEnabled(false);
break;
case Practice::itGroupItem:
ui.actAddFiles->setEnabled(true);
ui.actAddFolder->setEnabled(true);
ui.actDeleteItem->setEnabled(true);
break;
case Practice::itImageItem:
ui.actAddFiles->setEnabled(true);
ui.actAddFolder->setEnabled(false);//图片节点不能添加文件夹
ui.actDeleteItem->setEnabled(true);
disPlayImage(current);
break;
}
}
/*自定义QTreeWIdget的右键Menu*/
void Practice::onTreeFilesCustomContextMenuRequired(QPoint pos) {
QMenu *menu = new QMenu();
menu->addAction(ui.actAddFiles);
menu->addAction(ui.actAddFolder);
menu->addAction(ui.actDeleteItem);
menu->addSeparator();
menu->addAction(ui.actTraversalItems);
menu->exec(QCursor::pos());
delete menu;
}
void Practice::onActDeleteItemTriggered() {
QTreeWidgetItem *item = ui.treeFiles->currentItem();
if (!checkTreeWidgetItem(item))return;
QTreeWidgetItem *parent = item->parent();
parent->removeChild(item);//从ui移除一个节点,并不会释放内存,类似于list
delete item;
}
/*适合高度*/
void Practice::onActZoomFitHTriggered() {
int height = ui.scrollArea->height();
int realHeight = currentPixmap.height();
QPixmap pix = currentPixmap.scaledToHeight(height - 30);
pixRatio = static_cast<double>(height) / realHeight;//保存比例
ui.labDisplayPix->setPixmap(pix);
}
/*适合宽度*/
void Practice::onActZoomFitWTriggered() {
int width = ui.scrollArea->width();
int realWidth = currentPixmap.width();
QPixmap pix = currentPixmap.scaledToWidth(width);
pixRatio = static_cast<double>(width) / realWidth;
ui.labDisplayPix->setPixmap(pix);
}
/*放大图片*/
void Practice::onActZoomInTriggered() {
pixRatio *= 1.2;//放大1.2倍
int width = pixRatio * currentPixmap.width();
int height = pixRatio * currentPixmap.height();
QPixmap pix = currentPixmap.scaled(width, height);
ui.labDisplayPix->setPixmap(pix);
}
/*缩小图片*/
void Practice::onActZoomOutTriggered() {
if (currentPixmap.height() * pixRatio <= ui.scrollArea->height() / 2) {
QMessageBox::information(this, QStringLiteral("最小了"), QStringLiteral("无法更小"), QMessageBox::Ok);
return;
}
pixRatio /= 1.2;
int width = pixRatio * currentPixmap.width();
int height = pixRatio * currentPixmap.height();
QPixmap pix = currentPixmap.scaled(width, height);
ui.labDisplayPix->setPixmap(pix);
}
/*显示图片真实大小*/
void Practice::onActZoomRealSizeTriggered() {
pixRatio = 1;
ui.labDisplayPix->setPixmap(currentPixmap);
}
void Practice::disPlayImage(QTreeWidgetItem *item) {
QString fileName = item->data(Practice::colItem, Qt::UserRole).toString();//读取节点信息,转换成字符串
QFile file(fileName);
QImage img(fileName);

bool isOk = file.open(QIODevice::ReadOnly);
if (isOk) {
/*不要直接载入文件,QPixmap在处理24位深的图片时会出错*/
QByteArray data = file.readAll();
currentPixmap.loadFromData(data);
redrawPixmap(&currentPixmap);
}

}

/*功能函数 重新调整图片大小*/
void Practice::redrawPixmap(const QPixmap *pixmap) {
if(pixmap->height()>pixmap->width())
this->onActZoomFitHTriggered();
else
this->onActZoomFitWTriggered();
}

void Practice::onActDockVisibleToggled(bool arg1) {
ui.dockWidget->setVisible(arg1);
}
void Practice::onDockWidgetVisibilityChanged(bool visible) {
ui.actDockVisible->setChecked(visible);
}
void Practice::onActDockFloatTriggered(bool checked) {
ui.dockWidget->setFloating(checked);
}
void Practice::onDockTopLevelChanged(bool topLevel) {
ui.actDockFloating->setChecked(topLevel);
}
/*检查当前QTreeWidget是否选中项*/
bool Practice::checkTreeWidgetItem(QTreeWidgetItem *item) {
if (!item) {
QMessageBox::warning(this, QStringLiteral("警告"),
QStringLiteral("没有选中任何项(只有在顶层节点和Group节点可以添加文件夹子节点,\
Image节点添加子节点默认为其父节点,顶层节点无法删除)"), QMessageBox::Ok);
return false;
}
return true;
}

/*使用鼠标拖动窗口*/

void Practice::mousePressEvent(QMouseEvent *event) {
this->isDraging = true;
/*得到相对于widget的坐标*/
this->mLastRelPos = event->globalPos() - this->pos();
QMainWindow::mousePressEvent(event);

}

void Practice::mouseMoveEvent(QMouseEvent *event) {
this->newWindowPos = event->globalPos() - this->mLastRelPos;
if (this->isDraging && (event->buttons() & Qt::LeftButton) &&
(this->newWindowPos - this->pos()).manhattanLength() > 1) {
this->move(this->newWindowPos);
/*保存新的相对坐标*/
this->mLastRelPos = event->globalPos() - this->pos();
}

QMainWindow::mouseMoveEvent(event);
}



void Practice::mouseReleaseEvent(QMouseEvent *event) {
this->isDraging = false;
}


void Practice::resizeEvent(QResizeEvent *event) {
redrawPixmap(&(this->currentPixmap));
}

ui_viewImg.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
/********************************************************************************
** Form generated from reading UI file 'viewImg.ui'
**
** Created by: Qt User Interface Compiler version 5.15.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_VIEWIMG_H
#define UI_VIEWIMG_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDockWidget>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QScrollArea>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_PracticeClass
{
public:
QAction *actAddFolder;
QAction *actAddFiles;
QAction *actDeleteItem;
QAction *actTraversalItems;
QAction *actZoomIn;
QAction *actZoomOut;
QAction *actZoomRealSize;
QAction *actZoomFitH;
QAction *actZoomFitW;
QAction *actQuit;
QAction *actDockFloating;
QAction *actDockVisible;
QWidget *centralwidget;
QHBoxLayout *horizontalLayout;
QScrollArea *scrollArea;
QWidget *scrollAreaWidgetContents;
QVBoxLayout *verticalLayout;
QLabel *labDisplayPix;
QStatusBar *statusbar;
QDockWidget *dockWidget;
QWidget *dockWidgetContents;
QHBoxLayout *horizontalLayout_2;
QTreeWidget *treeFiles;
QToolBar *toolBar;

void setupUi(QMainWindow *PracticeClass)
{
if (PracticeClass->objectName().isEmpty())
PracticeClass->setObjectName(QString::fromUtf8("PracticeClass"));
PracticeClass->setEnabled(true);
PracticeClass->resize(704, 489);
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(PracticeClass->sizePolicy().hasHeightForWidth());
PracticeClass->setSizePolicy(sizePolicy);
PracticeClass->setMinimumSize(QSize(0, 0));
PracticeClass->setStyleSheet(QString::fromUtf8("QWidget{background-color:rgb(255, 250, 249)}\n"
"\n"
""));
actAddFolder = new QAction(PracticeClass);
actAddFolder->setObjectName(QString::fromUtf8("actAddFolder"));
actAddFolder->setEnabled(true);
QIcon icon;
icon.addFile(QString::fromUtf8(":/pics/vorctorIcon/\346\226\207\344\273\266\345\244\271.png"), QSize(), QIcon::Normal, QIcon::Off);
actAddFolder->setIcon(icon);
actAddFiles = new QAction(PracticeClass);
actAddFiles->setObjectName(QString::fromUtf8("actAddFiles"));
actAddFiles->setEnabled(true);
QIcon icon1;
icon1.addFile(QString::fromUtf8(":/pics/vorctorIcon/mediaAdd.ico"), QSize(), QIcon::Normal, QIcon::Off);
actAddFiles->setIcon(icon1);
actDeleteItem = new QAction(PracticeClass);
actDeleteItem->setObjectName(QString::fromUtf8("actDeleteItem"));
actDeleteItem->setEnabled(true);
QIcon icon2;
icon2.addFile(QString::fromUtf8(":/pics/vorctorIcon/\345\210\240\351\231\244\347\255\233\351\200\211\351\241\271.png"), QSize(), QIcon::Normal, QIcon::Off);
actDeleteItem->setIcon(icon2);
actTraversalItems = new QAction(PracticeClass);
actTraversalItems->setObjectName(QString::fromUtf8("actTraversalItems"));
QIcon icon3;
icon3.addFile(QString::fromUtf8("vorctorIcon/\347\233\256\345\275\225\351\201\215\345\216\206.png"), QSize(), QIcon::Normal, QIcon::Off);
actTraversalItems->setIcon(icon3);
actZoomIn = new QAction(PracticeClass);
actZoomIn->setObjectName(QString::fromUtf8("actZoomIn"));
QIcon icon4;
icon4.addFile(QString::fromUtf8(":/pics/vorctorIcon/zoomIn.ico"), QSize(), QIcon::Normal, QIcon::Off);
actZoomIn->setIcon(icon4);
actZoomIn->setShortcutContext(Qt::WindowShortcut);
actZoomIn->setIconVisibleInMenu(true);
actZoomOut = new QAction(PracticeClass);
actZoomOut->setObjectName(QString::fromUtf8("actZoomOut"));
QIcon icon5;
icon5.addFile(QString::fromUtf8(":/pics/vorctorIcon/zoomOut.ico"), QSize(), QIcon::Normal, QIcon::Off);
actZoomOut->setIcon(icon5);
actZoomRealSize = new QAction(PracticeClass);
actZoomRealSize->setObjectName(QString::fromUtf8("actZoomRealSize"));
QIcon icon6;
icon6.addFile(QString::fromUtf8(":/pics/vorctorIcon/rotateLeft.ico"), QSize(), QIcon::Normal, QIcon::Off);
actZoomRealSize->setIcon(icon6);
actZoomFitH = new QAction(PracticeClass);
actZoomFitH->setObjectName(QString::fromUtf8("actZoomFitH"));
QIcon icon7;
icon7.addFile(QString::fromUtf8(":/pics/vorctorIcon/\351\253\230\345\272\246.png"), QSize(), QIcon::Normal, QIcon::Off);
actZoomFitH->setIcon(icon7);
actZoomFitW = new QAction(PracticeClass);
actZoomFitW->setObjectName(QString::fromUtf8("actZoomFitW"));
QIcon icon8;
icon8.addFile(QString::fromUtf8(":/pics/vorctorIcon/\345\256\275\345\272\246.png"), QSize(), QIcon::Normal, QIcon::Off);
actZoomFitW->setIcon(icon8);
actQuit = new QAction(PracticeClass);
actQuit->setObjectName(QString::fromUtf8("actQuit"));
QIcon icon9;
icon9.addFile(QString::fromUtf8(":/pics/vorctorIcon/\351\200\200\345\207\272.png"), QSize(), QIcon::Normal, QIcon::Off);
actQuit->setIcon(icon9);
actDockFloating = new QAction(PracticeClass);
actDockFloating->setObjectName(QString::fromUtf8("actDockFloating"));
actDockFloating->setCheckable(true);
QIcon icon10;
icon10.addFile(QString::fromUtf8(":/pics/vorctorIcon/\346\265\256\345\212\250.png"), QSize(), QIcon::Normal, QIcon::Off);
actDockFloating->setIcon(icon10);
actDockVisible = new QAction(PracticeClass);
actDockVisible->setObjectName(QString::fromUtf8("actDockVisible"));
actDockVisible->setCheckable(true);
QIcon icon11;
icon11.addFile(QString::fromUtf8(":/pics/vorctorIcon/\345\217\257\350\247\201.png"), QSize(), QIcon::Normal, QIcon::Off);
actDockVisible->setIcon(icon11);
centralwidget = new QWidget(PracticeClass);
centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
horizontalLayout = new QHBoxLayout(centralwidget);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
scrollArea = new QScrollArea(centralwidget);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
scrollArea->setMinimumSize(QSize(0, 0));
scrollArea->setWidgetResizable(true);
scrollAreaWidgetContents = new QWidget();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 406, 410));
verticalLayout = new QVBoxLayout(scrollAreaWidgetContents);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
labDisplayPix = new QLabel(scrollAreaWidgetContents);
labDisplayPix->setObjectName(QString::fromUtf8("labDisplayPix"));

verticalLayout->addWidget(labDisplayPix);

scrollArea->setWidget(scrollAreaWidgetContents);

horizontalLayout->addWidget(scrollArea);

PracticeClass->setCentralWidget(centralwidget);
statusbar = new QStatusBar(PracticeClass);
statusbar->setObjectName(QString::fromUtf8("statusbar"));
PracticeClass->setStatusBar(statusbar);
dockWidget = new QDockWidget(PracticeClass);
dockWidget->setObjectName(QString::fromUtf8("dockWidget"));
sizePolicy.setHeightForWidth(dockWidget->sizePolicy().hasHeightForWidth());
dockWidget->setSizePolicy(sizePolicy);
dockWidget->setMinimumSize(QSize(178, 340));
dockWidget->setMaximumSize(QSize(524287, 524287));
dockWidget->setBaseSize(QSize(0, 0));
dockWidget->setFloating(false);
dockWidget->setFeatures(QDockWidget::AllDockWidgetFeatures);
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);
dockWidgetContents = new QWidget();
dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
horizontalLayout_2 = new QHBoxLayout(dockWidgetContents);
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
treeFiles = new QTreeWidget(dockWidgetContents);
treeFiles->setObjectName(QString::fromUtf8("treeFiles"));
sizePolicy.setHeightForWidth(treeFiles->sizePolicy().hasHeightForWidth());
treeFiles->setSizePolicy(sizePolicy);
treeFiles->setMinimumSize(QSize(160, 300));
treeFiles->setMaximumSize(QSize(16777215, 16777215));
treeFiles->setBaseSize(QSize(0, 0));
treeFiles->viewport()->setProperty("cursor", QVariant(QCursor(Qt::ArrowCursor)));
treeFiles->setContextMenuPolicy(Qt::CustomContextMenu);
treeFiles->setColumnCount(2);
treeFiles->header()->setVisible(true);
treeFiles->header()->setCascadingSectionResizes(false);
treeFiles->header()->setMinimumSectionSize(120);
treeFiles->header()->setDefaultSectionSize(120);
treeFiles->header()->setHighlightSections(false);

horizontalLayout_2->addWidget(treeFiles);

dockWidget->setWidget(dockWidgetContents);
PracticeClass->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
toolBar = new QToolBar(PracticeClass);
toolBar->setObjectName(QString::fromUtf8("toolBar"));
toolBar->setMinimumSize(QSize(0, 0));
toolBar->setStyleSheet(QString::fromUtf8(""));
toolBar->setToolButtonStyle(Qt::ToolButtonFollowStyle);
PracticeClass->addToolBar(Qt::TopToolBarArea, toolBar);

toolBar->addAction(actAddFolder);
toolBar->addAction(actAddFiles);
toolBar->addAction(actDeleteItem);
toolBar->addAction(actTraversalItems);
toolBar->addSeparator();
toolBar->addAction(actZoomIn);
toolBar->addAction(actZoomOut);
toolBar->addAction(actZoomRealSize);
toolBar->addAction(actZoomFitH);
toolBar->addAction(actZoomFitW);
toolBar->addAction(actDockFloating);
toolBar->addAction(actDockVisible);
toolBar->addAction(actQuit);

retranslateUi(PracticeClass);
QObject::connect(actAddFolder, SIGNAL(triggered()), PracticeClass, SLOT(onActAddFolderTriggered()));
QObject::connect(actAddFiles, SIGNAL(triggered()), PracticeClass, SLOT(onActAddFilesTriggered()));
QObject::connect(treeFiles, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), PracticeClass, SLOT(onTreeFilesCurrentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
QObject::connect(treeFiles, SIGNAL(customContextMenuRequested(QPoint)), PracticeClass, SLOT(onTreeFilesCustomContextMenuRequired(QPoint)));
QObject::connect(actDeleteItem, SIGNAL(triggered()), PracticeClass, SLOT(onActDeleteItemTriggered()));
QObject::connect(actTraversalItems, SIGNAL(triggered()), PracticeClass, SLOT(onActTraversalTriggered()));
QObject::connect(actZoomIn, SIGNAL(triggered()), PracticeClass, SLOT(onActZoomInTriggered()));
QObject::connect(actZoomOut, SIGNAL(triggered()), PracticeClass, SLOT(onActZoomOutTriggered()));
QObject::connect(actZoomRealSize, SIGNAL(triggered()), PracticeClass, SLOT(onActZoomRealSizeTriggered()));
QObject::connect(actZoomFitW, SIGNAL(triggered()), PracticeClass, SLOT(onActZoomFitWTriggered()));
QObject::connect(actZoomFitH, SIGNAL(triggered()), PracticeClass, SLOT(onActZoomFitHTriggered()));
QObject::connect(dockWidget, SIGNAL(visibilityChanged(bool)), PracticeClass, SLOT(onDockWidgetVisibilityChanged(bool)));
QObject::connect(actDockVisible, SIGNAL(toggled(bool)), PracticeClass, SLOT(onActDockVisibleToggled(bool)));
QObject::connect(actDockFloating, SIGNAL(triggered(bool)), PracticeClass, SLOT(onActDockFloatTriggered(bool)));
QObject::connect(dockWidget, SIGNAL(topLevelChanged(bool)), PracticeClass, SLOT(onDockTopLevelChanged(bool)));
QObject::connect(actQuit, SIGNAL(triggered()), PracticeClass, SLOT(close()));

QMetaObject::connectSlotsByName(PracticeClass);
} // setupUi

void retranslateUi(QMainWindow *PracticeClass)
{
PracticeClass->setWindowTitle(QCoreApplication::translate("PracticeClass", "viewImg", nullptr));
actAddFolder->setText(QCoreApplication::translate("PracticeClass", "\346\267\273\345\212\240\347\233\256\345\275\225", nullptr));
#if QT_CONFIG(tooltip)
actAddFolder->setToolTip(QCoreApplication::translate("PracticeClass", "\346\267\273\345\212\240\347\233\256\345\275\225", nullptr));
#endif // QT_CONFIG(tooltip)
actAddFiles->setText(QCoreApplication::translate("PracticeClass", "\346\267\273\345\212\240\346\226\207\344\273\266", nullptr));
#if QT_CONFIG(tooltip)
actAddFiles->setToolTip(QCoreApplication::translate("PracticeClass", "\346\267\273\345\212\240\346\226\207\344\273\266", nullptr));
#endif // QT_CONFIG(tooltip)
actDeleteItem->setText(QCoreApplication::translate("PracticeClass", "\345\210\240\351\231\244", nullptr));
#if QT_CONFIG(tooltip)
actDeleteItem->setToolTip(QCoreApplication::translate("PracticeClass", "\345\210\240\351\231\244\350\212\202\347\202\271", nullptr));
#endif // QT_CONFIG(tooltip)
actTraversalItems->setText(QCoreApplication::translate("PracticeClass", "\351\201\215\345\216\206", nullptr));
#if QT_CONFIG(tooltip)
actTraversalItems->setToolTip(QCoreApplication::translate("PracticeClass", "\351\201\215\345\216\206\350\212\202\347\202\271", nullptr));
#endif // QT_CONFIG(tooltip)
actZoomIn->setText(QCoreApplication::translate("PracticeClass", "\346\224\276\345\244\247", nullptr));
actZoomIn->setIconText(QCoreApplication::translate("PracticeClass", "\346\224\276\345\244\247", nullptr));
#if QT_CONFIG(tooltip)
actZoomIn->setToolTip(QCoreApplication::translate("PracticeClass", "\346\224\276\345\244\247", nullptr));
#endif // QT_CONFIG(tooltip)
actZoomOut->setText(QCoreApplication::translate("PracticeClass", "\347\274\251\345\260\217", nullptr));
#if QT_CONFIG(tooltip)
actZoomOut->setToolTip(QCoreApplication::translate("PracticeClass", "\347\274\251\345\260\217", nullptr));
#endif // QT_CONFIG(tooltip)
actZoomRealSize->setText(QCoreApplication::translate("PracticeClass", "\347\234\237\345\256\236\345\244\247\345\260\217", nullptr));
#if QT_CONFIG(tooltip)
actZoomRealSize->setToolTip(QCoreApplication::translate("PracticeClass", "\347\234\237\345\256\236\345\244\247\345\260\217", nullptr));
#endif // QT_CONFIG(tooltip)
actZoomFitH->setText(QCoreApplication::translate("PracticeClass", "\351\200\202\345\220\210\351\253\230\345\272\246", nullptr));
#if QT_CONFIG(tooltip)
actZoomFitH->setToolTip(QCoreApplication::translate("PracticeClass", "\351\200\202\345\220\210\351\253\230\345\272\246", nullptr));
#endif // QT_CONFIG(tooltip)
actZoomFitW->setText(QCoreApplication::translate("PracticeClass", "\351\200\202\345\220\210\345\256\275\345\272\246", nullptr));
#if QT_CONFIG(tooltip)
actZoomFitW->setToolTip(QCoreApplication::translate("PracticeClass", "\351\200\202\345\220\210\345\256\275\345\272\246", nullptr));
#endif // QT_CONFIG(tooltip)
actQuit->setText(QCoreApplication::translate("PracticeClass", "\351\200\200\345\207\272", nullptr));
#if QT_CONFIG(tooltip)
actQuit->setToolTip(QCoreApplication::translate("PracticeClass", "\351\200\200\345\207\272", nullptr));
#endif // QT_CONFIG(tooltip)
actDockFloating->setText(QCoreApplication::translate("PracticeClass", "\346\265\256\345\212\250", nullptr));
#if QT_CONFIG(tooltip)
actDockFloating->setToolTip(QCoreApplication::translate("PracticeClass", "\347\252\227\345\217\243\346\202\254\346\265\256", nullptr));
#endif // QT_CONFIG(tooltip)
actDockVisible->setText(QCoreApplication::translate("PracticeClass", "\345\217\257\350\247\201", nullptr));
#if QT_CONFIG(tooltip)
actDockVisible->setToolTip(QCoreApplication::translate("PracticeClass", "\347\252\227\345\217\243\345\217\257\350\247\201", nullptr));
#endif // QT_CONFIG(tooltip)
labDisplayPix->setText(QString());
#if QT_CONFIG(tooltip)
dockWidget->setToolTip(QString());
#endif // QT_CONFIG(tooltip)
dockWidget->setWindowTitle(QCoreApplication::translate("PracticeClass", "dockWidget", nullptr));
QTreeWidgetItem *___qtreewidgetitem = treeFiles->headerItem();
___qtreewidgetitem->setText(1, QCoreApplication::translate("PracticeClass", "itemType", nullptr));
___qtreewidgetitem->setText(0, QCoreApplication::translate("PracticeClass", "item", nullptr));
#if QT_CONFIG(tooltip)
treeFiles->setToolTip(QString());
#endif // QT_CONFIG(tooltip)
toolBar->setWindowTitle(QCoreApplication::translate("PracticeClass", "toolBar", nullptr));
} // retranslateUi

};

namespace Ui {
class PracticeClass: public Ui_PracticeClass {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_VIEWIMG_H