写在前面的话
这段代码的作用是创建一个简单的图像信息展示应用程序,用户可以点击按钮查看特定文件夹中图像的文件名、大小,并通过查看按钮查看图像。请注意,文件夹路径需要根据实际情况进行修改。
代码讲解
这段代码是使用PyQt5库创建一个简单的图像信息展示应用程序。它包含一个主窗口类MainWindow
和一个图像信息对话框类ImageInfoDialog
。
首先,代码导入了必要的PyQt5模块和os
模块。然后定义了MainWindow
类,继承自QMainWindow
,它是应用程序的主窗口。在MainWindow
的构造函数中,设置了窗口的标题、大小和布局。创建了一个垂直布局,并将其设置为主窗口的中心部件。接着创建了一个按钮QPushButton
,并将其添加到布局中。通过clicked
信号连接到show_image_info
槽函数。
show_image_info
函数是MainWindow
类的一个方法,它在按钮被点击时调用。该方法创建了一个ImageInfoDialog
实例,并显示出来。ImageInfoDialog
类是一个继承自QDialog
的自定义对话框类,用于显示图像的信息。在构造函数中,设置了对话框的标题、大小和布局,并创建了一个表格QTableWidget
用于显示图像的文件名、大小和查看按钮。
通过populate_table
方法,获取指定文件夹下的文件列表,并将文件信息填充到表格中。每一行的查看按钮与show_image
槽函数连接,用于展示图像。
def populate_table(self):
folder_path = r'E:\DL\Spelling-Rectifier-Web-App\images' # 修改为实际的文件夹路径
files = os.listdir(folder_path)
self.table.setRowCount(len(files))
for i, filename in enumerate(files):
file_path = os.path.join(folder_path, filename)
item = QTableWidgetItem(filename)
self.table.setItem(i, 0, item)
size = os.path.getsize(file_path)
item = QTableWidgetItem(f'{size / 1024:.2f} KB')
self.table.setItem(i, 1, item)
button = QPushButton('View', self.table)
button.clicked.connect(lambda state, f=file_path: self.show_image(f))
self.table.setCellWidget(i, 2, button)
self.table.resizeColumnsToContents()
show_image
函数根据文件路径加载图像,并在一个新的对话框中显示。它使用QPixmap
和QLabel
来展示图像。
def show_image(self, file_path):
pixmap = QPixmap(file_path)
if not pixmap.isNull():
self.dialog = QDialog()
self.dialog.setWindowTitle('View Image')
self.dialog.setGeometry(500, 500, pixmap.width() + 20, pixmap.height() + 20)
self.dialog.setLayout(QVBoxLayout())
label = QLabel(self.dialog)
label.setPixmap(pixmap)
self.dialog.layout().addWidget(label)
self.dialog.exec_()
最后,在__main__
块中创建了一个QApplication
实例,实例化了MainWindow
类并显示主窗口,最后通过调用app.exec_()
启动应用程序的事件循环。
完整代码
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import os
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('MainWindow')
self.setGeometry(300, 300, 800, 600)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
layout = QVBoxLayout(self.central_widget)
self.button = QPushButton('Show Images Info', self.central_widget)
layout.addWidget(self.button)
self.button.clicked.connect(self.show_image_info)
def show_image_info(self):
self.image_info_dialog = ImageInfoDialog()
self.image_info_dialog.show()
class ImageInfoDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle('Image Information')
self.setGeometry(400, 400, 800, 600)
self.setLayout(QVBoxLayout())
self.table = QTableWidget()
self.layout().addWidget(self.table)
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['Filename', 'Size', 'View'])
self.table.horizontalHeader().setStretchLastSection(True)
self.table.verticalHeader().setVisible(False)
self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.table.setShowGrid(False)
self.populate_table()
'''文件检索'''
def populate_table(self):
folder_path = r'E:\DL\Spelling-Rectifier-Web-App\images' # 修改为实际的文件夹路径
files = os.listdir(folder_path)
self.table.setRowCount(len(files))
for i, filename in enumerate(files):
file_path = os.path.join(folder_path, filename)
item = QTableWidgetItem(filename)
self.table.setItem(i, 0, item)
size = os.path.getsize(file_path)
item = QTableWidgetItem(f'{size / 1024:.2f} KB')
self.table.setItem(i, 1, item)
button = QPushButton('View', self.table)
button.clicked.connect(lambda state, f=file_path: self.show_image(f))
self.table.setCellWidget(i, 2, button)
self.table.resizeColumnsToContents()
def show_image(self, file_path):
pixmap = QPixmap(file_path)
if not pixmap.isNull():
self.dialog = QDialog()
self.dialog.setWindowTitle('View Image')
self.dialog.setGeometry(500, 500, pixmap.width() + 20, pixmap.height() + 20)
self.dialog.setLayout(QVBoxLayout())
label = QLabel(self.dialog)
label.setPixmap(pixmap)
self.dialog.layout().addWidget(label)
self.dialog.exec_()
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
代码功能演示
注意事项
- 检索图像的文件路径要正确
- 图像显示大小不能调整