深度编辑器向我们展示了程序单例并在新标签打开文本,我好羡慕啊!
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();
}
}