QDBus实现只运行一个程序并在新标签打开文本

深度编辑器向我们展示了程序单例并在新标签打开文本,我好羡慕啊!
QDBus概念太抽象,看了几天都没看懂,好郁闷,然后做其他项目去了,看看电视,骑骑单车,晒晒太阳,赏赏花,然后再来看看QDBus,一句一句调试,实验成功后,发现QDBus更像是另一种 Signal/Slot。
参考:

https://blog.rekols.com/2018/09/29/dbus-basis/
http://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html

QDBus查看工具:qdbusviewer

 

源码:

https://github.com/sonichy/QDBusSAONT

https://download.csdn.net/download/sonichty/10731711

 

main.cpp
#include "stdio.h"

#include "mainwindow.h"

#include <QApplication>

#include <QDesktopWidget>

#include <QDBusConnection>

#include <QDBusInterface>

#include <QDBusReply>

#include <QDebug>

#include <QDateTime>

#include <QFile>

#include <QDir>

 

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    qSetMessagePattern("[ %{file}: %{line} ] %{message}");

 

    // 日志

    QDateTime currentDateTime = QDateTime::currentDateTime();

    QString log = "[" + currentDateTime.toString("yyyy/MM/dd HH:mm:ss") + "] ";

//    for(int i=0; i<argc; i++){

//        log += " " + QString::fromLocal8Bit(argv[i]);

//    }

    QStringList args = QApplication::arguments();

    for(int i=0; i<args.length(); i++){

        log += " " + args.at(i);

    }

    log += "\n";

    QFile file(QApplication::applicationDirPath() + "/log.txt");

    if (file.open(QFile::WriteOnly|QIODevice::Append)) {

        file.write(log.toUtf8());

        file.close();

    }

 

    // 连接到 DBus 总线

    QDBusConnection dbus = QDBusConnection::sessionBus();

    // 如果注册成功则创建窗口(必须以 xxx.xxx 来指定 service name)

    if (dbus.registerService("com.hty.edit")) {

        MainWindow w;

        w.move(QApplication::desktop()->width()/2-w.width()/2, QApplication::desktop()->height()/2-w.height()/2);

        w.show();

        // 所有Slot都导出为这个Object的method

        dbus.registerObject("/hty/edit", &w, QDBusConnection::ExportAllSlots);

        return a.exec();

    }else{

        qDebug() << "QDBusInterface";

        QDBusInterface interface( "com.hty.edit", "/hty/edit", "com.hty.edit.registry", QDBusConnection::sessionBus());

        if (!interface.isValid()) {

            //qDebug() << qPrintable(QDBusConnection::sessionBus().lastError().message());

            qDebug() << QDBusConnection::sessionBus().lastError().message();

            exit(1);

        }

        // 呼叫远程

        qDebug() << "QDBusInterface.call(load(" << argv[1] << ")";

        QDBusReply<QString> reply = interface.call("load", QString::fromLocal8Bit(argv[1]));

//        QDBusReply<QString> reply;

//        QStringList args = QApplication::arguments();

//        if(args.length()>1){

//            reply = interface.call("load", args.at(1));

//            qDebug() << "QDBusInterface.call(load(" << args.at(1) << ")";

//        }

        if (reply.isValid()) {

            QString s = reply.value();

            qDebug() << s;

        } else {

            qDebug() << "QDBusReply is invalid!";

        }

        return 0;

    }

 


mainwindow.h
#ifndef MAINWINDOW_H

#define MAINWINDOW_H

 

#include <QMainWindow>

 

namespace Ui {

class MainWindow;

}

 

class MainWindow : public QMainWindow

{

    Q_OBJECT

    Q_CLASSINFO("D-Bus Interface", "com.hty.edit.registry")

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

 

private:

    Ui::MainWindow *ui;

 

public slots:

    void on_actionNew_triggered();

    void on_actionOpen_triggered();

    QString load(QString filepath);

 

};

 


#endif // MAINWINDOW_H
 

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QTextEdit>

#include <QFile>

#include <QMessageBox>

#include <QTextStream>

#include <QFile>

#include <QMdiSubWindow>

#include <QFileDialog>

 

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

}

 

MainWindow::~MainWindow()

{

    delete ui;

}

 

void MainWindow::on_actionNew_triggered()

{

    QTextEdit *textEdit = new QTextEdit;

    textEdit->setText("这是一个新文档");

    //QMdiSubWindow *subWindow =

    ui->mdiArea->addSubWindow(textEdit);

    //Q_UNUSED(subWindow);

}

 

void MainWindow::on_actionOpen_triggered()

{

    QString filename = QFileDialog::getOpenFileName(this, "打开文本", ".");

    if (!filename.isEmpty()) {

        load(filename);

    }

}

 

QString MainWindow::load(QString filepath)

{

    if(filepath.contains("file://")){

        filepath.remove("file://");

    }

    QFile file(filepath);

    bool ok = file.open(QIODevice::ReadOnly);

    if(ok){

        QTextStream TS(&file);

        QString s = TS.readAll();

        file.close();

        //delete file;

        QTextEdit *textEdit =  new QTextEdit;

        textEdit->setWindowTitle(filepath);

        textEdit->setPlainText(s);

        ui->mdiArea->addSubWindow(textEdit);

        activateWindow();

        return filepath + " load sucessful";

    }else{

        QMessageBox::warning(this, "错误", QString(" %1:\n%2").arg(filepath).arg(file.errorString()));

        return file.errorString();

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值