默认启动APP配置文件:
~/.local/share/applications/mimeapps.list
~/.config/mimeapps.list
/etc/gnome/defaults.list //全局
QAction *action_choose_default_app = new QAction(menu_openwith);
action_choose_default_app->setText("选择默认程序&C");
menu_openwith->addAction(action_choose_default_app);
connect(action_choose_default_app, &QAction::triggered, [=](){
QDialog *dialog = new QDialog(this);
dialog->setWindowTitle("打开方式");
dialog->setFixedSize(600,500);
QVBoxLayout *vbox = new QVBoxLayout;
dialog->setLayout(vbox);
QLabel *label = new QLabel("推荐应用 " + QString::number(actions_recommend_app.size()));
vbox->addWidget(label);
QListWidget *listWidget_recommend_app = new QListWidget(dialog);
listWidget_recommend_app->setViewMode(QListView::IconMode);
listWidget_recommend_app->setDragDropMode(QAbstractItemView::NoDragDrop);
vbox->addWidget(listWidget_recommend_app);
foreach (QAction *action, actions_recommend_app) {
QListWidgetItem *LWI;
LWI = new QListWidgetItem(action->icon(), action->text());
LWI->setData(LOCATION_OF_REAL_PATH, action->property("path"));
LWI->setSizeHint(QSize(120,120));
listWidget_recommend_app->insertItem(listWidget_recommend_app->count() + 1, LWI);
}
QHBoxLayout *hbox = new QHBoxLayout;
vbox->addLayout(hbox);
label = new QLabel("其他应用");
hbox->addWidget(label);
QLineEdit *lineEdit = new QLineEdit(dialog);
QAction *action_lineEdit_filter = new QAction(lineEdit);
action_lineEdit_filter->setIcon(QIcon::fromTheme("search"));
lineEdit->addAction(action_lineEdit_filter, QLineEdit::LeadingPosition);
QAction *action_lineEdit_clear = new QAction(lineEdit);
action_lineEdit_clear->setIcon(QIcon::fromTheme("edit-clear"));
lineEdit->addAction(action_lineEdit_clear, QLineEdit::TrailingPosition);
hbox->addWidget(lineEdit);
hbox->addStretch();
QListWidget *listWidget_app = new QListWidget(dialog);
listWidget_app->setViewMode(QListView::IconMode);
listWidget_app->setDragDropMode(QAbstractItemView::NoDragDrop);
vbox->addWidget(listWidget_app);
connect(action_lineEdit_filter, &QAction::triggered, [=](){
openwith_filter(listWidget_app, lineEdit->text(), label);
});
//快捷键冲突
// connect(lineEdit, &QLineEdit::returnPressed, [=](){
// openwith_filter(listWidget_app, lineEdit->text(), label);
// });
connect(action_lineEdit_clear, &QAction::triggered, [=](){
lineEdit->clear();
openwith_filter(listWidget_app, "", label);
});
openwith_filter(listWidget_app, "", label);
//2个QListWidget单选
connect(listWidget_recommend_app, &QListWidget::itemSelectionChanged, [=](){
QList<QListWidgetItem*> list_recommend_app_selected = listWidget_recommend_app->selectedItems();
if (list_recommend_app_selected.size() != 0) {
listWidget_app->setCurrentRow(-1);
}
});
connect(listWidget_app, &QListWidget::itemSelectionChanged, [=](){
QList<QListWidgetItem*> list_app_selected = listWidget_app->selectedItems();
if (list_app_selected.size() != 0) {
listWidget_recommend_app->setCurrentRow(-1);
}
});
hbox = new QHBoxLayout;
hbox->addStretch();
vbox->addLayout(hbox);
QCheckBox *checkBox_default_app = new QCheckBox("设为默认");
hbox->addWidget(checkBox_default_app);
QPushButton *pushButton_cancel = new QPushButton("取消");
connect(pushButton_cancel, &QPushButton::pressed, [=](){
dialog->close();
});
hbox->addWidget(pushButton_cancel);
QPushButton *pushButton_confirm = new QPushButton("确定");
connect(pushButton_confirm, &QPushButton::pressed, [=](){
QListWidgetItem *LWI;
QList<QListWidgetItem*> list_recommend_app_selected = listWidget_recommend_app->selectedItems();
if (list_recommend_app_selected.size() != 0) {
LWI = listWidget_recommend_app->selectedItems().first();
} else {
LWI = listWidget_app->selectedItems().first();
}
QString desktop = LWI->data(LOCATION_OF_REAL_PATH).toString();
QString sExec = readSettings(desktop, "Desktop Entry", "Exec");
sExec = sExec.left(sExec.indexOf(" "));
QProcess *process = new QProcess;
process->setWorkingDirectory(path);
qDebug() << sExec;
process->setProgram(sExec);
process->setArguments(QStringList() << filepath);
bool b = process->startDetached();
qDebug() << b;
dialog->close();
if (checkBox_default_app->isChecked()) {
QString default_apps = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/.config/mimeapps.list";
QFile *file = new QFile;
file->setFileName(default_apps);
QString s="";
bool ok = file->open(QIODevice::ReadOnly);
if (ok) {
QTextStream TS(file);
s = TS.readAll();
file->close();
}
file->setFileName(default_apps);
ok = file->open(QFile::WriteOnly);
if (ok) {
QFileInfo FI(desktop);
QTextStream TS(file);
s.replace(QRegularExpression(MIME + "=.*\n"), MIME + "=" + FI.fileName() + "\n");
TS << s;
file->close();
}
}
});
hbox->addWidget(pushButton_confirm);
dialog->show();
});
打开方式过滤:
void MainWindow::openwith_filter(QListWidget *listWidget, QString text, QLabel *label)
{
listWidget->clear();
QDir dir("/usr/share/applications/");
dir.setNameFilters(QStringList() << "*.desktop");
if (text != "")
dir.setNameFilters(QStringList() << "*" + text + "*");
QFileInfoList FIL = dir.entryInfoList();
label->setText("其他应用 " + QString::number(FIL.size()));
for (int i = 0; i < FIL.size(); i++) {
QFileInfo fileInfo = FIL.at(i);
QString filepath = fileInfo.absoluteFilePath();
QString sname = readSettings(filepath, "Desktop Entry", "Name");
QString sicon = readSettings(filepath, "Desktop Entry", "Icon");
if (sicon == "")
sicon = "applications-system-symbolic";
QIcon icon;
if (QFileInfo(sicon).isFile()) {
icon = QIcon(sicon);
} else {
icon = QIcon::fromTheme(sicon);
}
QListWidgetItem *LWI;
LWI = new QListWidgetItem(icon, sname);
LWI->setData(LOCATION_OF_REAL_PATH, filepath);
LWI->setSizeHint(QSize(120,120));
listWidget->insertItem(listWidget->count() + 1, LWI);
}
};