美化QFileDialog

美化QFileDialog

效果图

在这里插入图片描述

#简述

在看Qt QFileDialog源码的时候,发现Qt自己做了一套文件管理框,UI如下;反之,Qt自己做了一套自己的UI文件,那么我们就能美化它。
在这里插入图片描述

功能

1.美化QFileDialog
2.支持QFileDialog的都支持
3.支持文件和文件夹多选

思路

自定义一个Dialog,UI如下
在这里插入图片描述

代码篇

CustomFileDialog::CustomFileDialog(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
    //设置QFileDialog 透明,无边框,子窗口属性
	m_fileDialog = new QFileDialog(this, Qt::SubWindow | Qt::FramelessWindowHint);
	m_fileDialog->setAttribute(Qt::WA_TranslucentBackground);
	//使用Qt的文件选项框
	m_fileDialog->setOption(QFileDialog::DontUseNativeDialog, true);
	//QFileDialog 添加到自定义UI中
	ui.bodylayout->addWidget(m_fileDialog);

	this->setAttribute(Qt::WA_TranslucentBackground);
	this->setWindowFlags(Qt::FramelessWindowHint);
	setTitleName(QString::fromLocal8Bit("文件选择框"));

	//支持多选,即支持文件和文件夹选中
	QListView *pListView = m_fileDialog->findChild<QListView*>("listView");
	if (pListView){
		pListView->setSelectionMode(QAbstractItemView::ExtendedSelection);
		pListView->setItemDelegate(new NoFocusDelegate(pListView));
	}
	QTreeView *pTreeView = m_fileDialog->findChild<QTreeView*>("treeView");
	if (pTreeView){
		pTreeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
		pTreeView->setItemDelegate(new NoFocusDelegate(pTreeView));
		pTreeView->header()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
	}
	QLabel* lookinLabel = m_fileDialog->findChild<QLabel*>("lookInLabel");
	if (lookinLabel)
		lookinLabel->setText(QString::fromLocal8Bit("文件目录:"));

	QComboBox* fileTypeCombo = m_fileDialog->findChild<QComboBox*>("fileTypeCombo");
	if (fileTypeCombo)
		fileTypeCombo->setMinimumHeight(24);
	QComboBox* lookInCombo = m_fileDialog->findChild<QComboBox*>("lookInCombo");
	if (lookInCombo)
		lookInCombo->setMinimumHeight(24); 
	QLineEdit* fileNameEdit = m_fileDialog->findChild<QLineEdit*>("fileNameEdit");
	if (fileNameEdit)
		fileNameEdit->setMinimumHeight(24);

	QDialogButtonBox *buttonBox = m_fileDialog->findChild<QDialogButtonBox *>("buttonBox");
	if (QPushButton *button = buttonBox->button(QDialogButtonBox::Open)){
		button->setStyleSheet("QPushButton{background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #00BAFF, stop: 1 #00A1FF);font-size: 12px;color: #FFFFFF;border-radius:2px;}"
							  "QPushButton:hover{background: #00C1FF;font-size: 12px;color: #FFFFFF;border-radius:2px;}"
							  "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 12px;color: #BBBBBB;border-radius:2px;}");
		button->setFixedSize(68, 24);
	}
	if (QPushButton *button = buttonBox->button(QDialogButtonBox::Save)){
		button->setStyleSheet("QPushButton{background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0,stop: 0 #00BAFF, stop: 1 #00A1FF);font-size: 12px;color: #FFFFFF;border-radius:2px;}"
							  "QPushButton:hover{background: #00C1FF;font-size: 12px;color: #FFFFFF;border-radius:2px;}"
							  "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 12px;color: #BBBBBB;border-radius:2px;}");
		button->setFixedSize(68, 24);
	}
	if (QPushButton *button = buttonBox->button(QDialogButtonBox::Cancel)){
		button->setStyleSheet("QPushButton{border: 1px solid #DDDDDD;font-size: 12px;color: #666666;border-radius:2px;}"
							  "QPushButton:hover{font-size: 12px;color: #00A1FF;border: 1px solid #00A1FF;border-radius:2px;}"
							  "QPushButton:disabled{background: #F0F0F0;border: 1px solid #DDDDDD;font-size: 12px;color: #BBBBBB;border-radius:2px;}");
		button->setText(QString::fromLocal8Bit("取消"));
		button->setFixedSize(68, 24);
	}

	buttonBox->disconnect();
	connect(buttonBox, SIGNAL(accepted()), this, SLOT(onAccepted()));//改成自己的槽
	connect(buttonBox, SIGNAL(rejected()), this, SLOT(onRejected()));//改成自己的槽

	connect(ui.sysMin, SIGNAL(clicked(bool)), this, SLOT(onShowMin(bool)));
	connect(ui.sysClose, SIGNAL(clicked(bool)), this, SLOT(onShowClose(bool)));
}

工程文件

Qt交流大会 853086607 收费群中
在这里插入图片描述

结尾

不定期上传新作品,解答作品相关问题。相关外,能解答则解答。欢迎大家一起探索Qt世界!

发布了102 篇原创文章 · 获赞 165 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ly305750665/article/details/82762517