Qt:文管打开方式:选择并设置默认程序

本文介绍了一个用于选择默认启动应用程序的GUI界面实现方案。通过自定义对话框,用户可以从推荐的应用程序列表或所有安装的应用程序中选择,并能设置所选应用为默认启动程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认启动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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值