【目的】
改变 QFileDialog 窗口的样式/风格,不让系统或者主界面的样式影响QFileDialog窗口。
主要是因为window和linux下切换窗口样式的设置不稳定
【解析】
QFileDialog的基类就是QDialog ,所以通过stylesheet 可以改变窗口样式。
1. QFileDialog.ui 解析
可以得到对应的每个控件的名字,这样通过QSS就可以直接设置他的颜色
2. QFileDialog.h 解析
a. option 官网说了 这个属性,应该在窗口属性改变和窗口显示之前设置。
DontUseNativeDialog: 表示不使用操作系统自带的窗口样式
enum Option
{
ShowDirsOnly = 0x00000001,
DontResolveSymlinks = 0x00000002,
DontConfirmOverwrite = 0x00000004,
#if QT_DEPRECATED_SINCE(5, 14)
DontUseSheet Q_DECL_ENUMERATOR_DEPRECATED = 0x00000008,
#endif
DontUseNativeDialog = 0x00000010,
ReadOnly = 0x00000020,
HideNameFilterDetails = 0x00000040,
DontUseCustomDirectoryIcons = 0x00000080
};
【样式设置】
const QString g_FileDialogQSS =
" .QFileDialog "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QListView "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QListView::item "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QComboBox QAbstractItemView "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QComboBox "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QComboBox QAbstractItemView ::item "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QLineEdit "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QFrame "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QSidebar "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QLabel "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QTreeView#treeView "
" { "
" background-color: #151515; "
" color: #FFFFFF; "
" } "
" .QPushButton "
" { "
" background-color: #151515; "
" border: 1px solid #414141; "
" border-radius: 3px; "
" color: #FFFFFF; "
" } ";
【窗口的使用】
QFileDialog fileDiag;
fileDiag.setParent(qSlicerApplication::application()->mainWindow());
fileDiag.setOption(QFileDialog::DontUseNativeDialog, true);
fileDiag.setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint);
fileDiag.setStyleSheet(g_FileDialogQSS);
fileDiag.setAcceptMode(QFileDialog::AcceptSave);
fileDiag.setLabelText(QFileDialog::Accept, tr("Save")); // 设置对应控件的文字
fileDiag.setWindowTitle(QString(u8"save"));
fileDiag.setNameFilter(tr(u8"file(*.jpg)"));
// 显示对话框
if (fileDiag.exec() != QDialog::Accepted)
{
return;
}
【结果】
【原窗口】window下的默认窗口