美化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世界!

以下是一个简单的音乐播放器的代码示例,基于Qt框架,使用QMediaPlayer实现音乐播放功能,同时添加了一些美化效果,如进度条和歌词显示等。 mainwindow.h: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QMediaPlayer> #include <QMediaPlaylist> #include <QTimer> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_playBtn_clicked(); void on_stopBtn_clicked(); void on_pauseBtn_clicked(); void on_volumeSlider_valueChanged(int value); void on_positionChanged(qint64 position); void on_durationChanged(qint64 duration); void updateDurationInfo(); void on_playlistBtn_clicked(); void on_playlistView_doubleClicked(const QModelIndex &index); private: Ui::MainWindow *ui; QMediaPlayer *m_player; QMediaPlaylist *m_playlist; QString m_currentSong; QTimer *m_timer; void setPlayIcon(); void setPauseIcon(); void setStopIcon(); void setupPlaylist(); void setupUI(); }; #endif // MAINWINDOW_H ``` mainwindow.cpp: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QMessageBox> #include <QMediaMetaData> #include <QDesktopServices> #include <QUrl> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); setupUI(); m_player = new QMediaPlayer(this); m_playlist = new QMediaPlaylist(this); m_player->setPlaylist(m_playlist); connect(m_player, &QMediaPlayer::positionChanged, this, &MainWindow::on_positionChanged); connect(m_player, &QMediaPlayer::durationChanged, this, &MainWindow::on_durationChanged); connect(m_player, &QMediaPlayer::stateChanged, this, &MainWindow::updateDurationInfo); m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &MainWindow::updateDurationInfo); setupPlaylist(); } MainWindow::~MainWindow() { delete ui; delete m_player; delete m_playlist; } void MainWindow::on_playBtn_clicked() { if (m_playlist->isEmpty()) { QMessageBox::information(this, "Error", "No songs in playlist!"); return; } if (m_player->state() == QMediaPlayer::PausedState) { m_player->play(); setPauseIcon(); } else if (m_player->state() == QMediaPlayer::StoppedState) { m_playlist->setCurrentIndex(0); m_player->play(); setPauseIcon(); } else { m_player->pause(); setPlayIcon(); } } void MainWindow::on_stopBtn_clicked() { m_player->stop(); setStopIcon(); } void MainWindow::on_pauseBtn_clicked() { if (m_player->state() == QMediaPlayer::PlayingState) { m_player->pause(); setPlayIcon(); } } void MainWindow::on_volumeSlider_valueChanged(int value) { m_player->setVolume(value); } void MainWindow::on_positionChanged(qint64 position) { ui->positionSlider->setValue(position); ui->positionLabel->setText(QDateTime::fromMSecsSinceEpoch(position).toUTC().toString("mm:ss")); } void MainWindow::on_durationChanged(qint64 duration) { ui->positionSlider->setRange(0, duration); ui->durationLabel->setText(QDateTime::fromMSecsSinceEpoch(duration).toUTC().toString("mm:ss")); } void MainWindow::updateDurationInfo() { qint64 position = m_player->position(); qint64 duration = m_player->duration(); ui->positionSlider->setValue(position); ui->durationLabel->setText(QDateTime::fromMSecsSinceEpoch(duration).toUTC().toString("mm:ss")); if (m_player->state() == QMediaPlayer::PlayingState) { setPauseIcon(); } else { setPlayIcon(); } } void MainWindow::on_playlistBtn_clicked() { ui->playlistView->setVisible(!ui->playlistView->isVisible()); } void MainWindow::on_playlistView_doubleClicked(const QModelIndex &index) { m_playlist->setCurrentIndex(index.row()); m_player->play(); setPauseIcon(); } void MainWindow::setPlayIcon() { ui->playBtn->setIcon(QIcon(":/icons/play.png")); } void MainWindow::setPauseIcon() { ui->playBtn->setIcon(QIcon(":/icons/pause.png")); } void MainWindow::setStopIcon() { ui->playBtn->setIcon(QIcon(":/icons/stop.png")); } void MainWindow::setupPlaylist() { QStringList files = QFileDialog::getOpenFileNames(this, "Select songs", QDir::homePath(), "*.mp3"); if (files.isEmpty()) { return; } foreach (QString file, files) { QMediaContent content(QUrl::fromLocalFile(file)); m_playlist->addMedia(content); QString title = QFileInfo(file).fileName(); ui->playlistView->addItem(title); } } void MainWindow::setupUI() { ui->positionSlider->setRange(0, 0); ui->volumeSlider->setRange(0, 100); ui->playBtn->setIcon(QIcon(":/icons/play.png")); ui->stopBtn->setIcon(QIcon(":/icons/stop.png")); ui->pauseBtn->setIcon(QIcon(":/icons/pause.png")); ui->playlistBtn->setIcon(QIcon(":/icons/playlist.png")); ui->coverLabel->setPixmap(QPixmap(":/images/cover.png")); ui->playlistView->setVisible(false); } ``` 其中,使用了以下资源文件: icons.qrc: ```xml <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>:/icons/play.png</file> <file>:/icons/pause.png</file> <file>:/icons/stop.png</file> <file>:/icons/playlist.png</file> </qresource> </RCC> ``` images.qrc: ```xml <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>:/images/cover.png</file> </qresource> </RCC> ``` 效果如下图所示: ![音乐播放器效果图](https://i.imgur.com/2bNoK4t.png)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨田哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值