Commit a1fbe5b2df5e27eee0098abd1b244b1e2e55d592

Authored by Peter Zhigalov
1 parent f432a2da

Доработал открытие файлов в OS X

fem_draw_qt.pro
... ... @@ -24,12 +24,14 @@ SOURCES += \
24 24 src_qt/libs/jo_jpeg.cpp \
25 25 src_qt/libs/jo_gif.cpp \
26 26 src_qt/libs/jo_tga.cpp \
  27 + src_qt/Application.cpp \
27 28 src_qt/paintwidget.cpp \
28 29 src_qt/main.cpp \
29 30 src_qt/mainwindow.cpp
30 31  
31 32 HEADERS += \
32 33 src_qt/libs/jo_images.h \
  34 + src_qt/Application.h \
33 35 src_qt/paintwidget.h \
34 36 src_qt/mainwindow.h
35 37  
... ...
src_qt/Application.cpp 0 → 100644
  1 +#include "Application.h"
  2 +#include <QEvent>
  3 +#include <QFileOpenEvent>
  4 +
  5 +/**
  6 + * @brief Конструктор
  7 + * @param[inout] argc Количество аргументов
  8 + * @param[inout] argv Массив C-строк - значений аргументов
  9 + */
  10 +Application::Application(int & argc, char ** argv)
  11 + : QApplication(argc, argv)
  12 +{}
  13 +
  14 +/**
  15 + * @brief Получить имя последнего файла, который пришел в QFileOpenEvent
  16 + * @return Имя последнего файла, который пришел в QFileOpenEvent
  17 + */
  18 +const QString & Application::getLastOpenFilename() const
  19 +{
  20 + return m_lastOpenFilename;
  21 +}
  22 +
  23 +/**
  24 + * @brief Узнать, сохранено ли имя последнего файла, который пришел в QFileOpenEvent
  25 + * @return true - имя сохранено, false - имя не сохранено
  26 + */
  27 +bool Application::hasLastOpenFilename() const
  28 +{
  29 + return !m_lastOpenFilename.isEmpty();
  30 +}
  31 +
  32 +/**
  33 + * @brief Обработчик событий
  34 + * @param[in] event Событие
  35 + * @return true - событие распознано и обработано, false - иначе
  36 + */
  37 +bool Application::event(QEvent * event)
  38 +{
  39 + if(event->type() == QEvent::FileOpen)
  40 + {
  41 + QFileOpenEvent * fileOpenEvent = static_cast<QFileOpenEvent *>(event);
  42 + if(fileOpenEvent)
  43 + {
  44 + m_lastOpenFilename = fileOpenEvent->file();
  45 + if(hasLastOpenFilename())
  46 + {
  47 + emit openFileEvent(m_lastOpenFilename);
  48 + return true;
  49 + }
  50 + }
  51 + }
  52 + return QApplication::event(event);
  53 +}
... ...
src_qt/Application.h 0 → 100644
  1 +#ifndef APPLICATION_H
  2 +#define APPLICATION_H
  3 +
  4 +#include <QApplication>
  5 +#include <QString>
  6 +
  7 +/**
  8 + * @brief Класс-обертка над QApplication, выполняющий обработку событий типа QFileOpenEvent
  9 + * @note https://stackoverflow.com/questions/26849866/unable-to-open-file-with-qt-app-on-mac
  10 + */
  11 +class Application : public QApplication
  12 +{
  13 + Q_OBJECT
  14 +public:
  15 + /**
  16 + * @brief Конструктор
  17 + * @param[inout] argc Количество аргументов
  18 + * @param[inout] argv Массив C-строк - значений аргументов
  19 + */
  20 + Application(int & argc, char ** argv);
  21 +
  22 + /**
  23 + * @brief Получить имя последнего файла, который пришел в QFileOpenEvent
  24 + * @return Имя последнего файла, который пришел в QFileOpenEvent
  25 + */
  26 + const QString & getLastOpenFilename() const;
  27 +
  28 + /**
  29 + * @brief Узнать, сохранено ли имя последнего файла, который пришел в QFileOpenEvent
  30 + * @return true - имя сохранено, false - имя не сохранено
  31 + */
  32 + bool hasLastOpenFilename() const;
  33 +
  34 +protected:
  35 + /**
  36 + * @brief Обработчик событий
  37 + * @param[in] event Событие
  38 + * @return true - событие распознано и обработано, false - иначе
  39 + */
  40 + bool event(QEvent * event);
  41 +
  42 +signals:
  43 + /**
  44 + * @brief Сигнал о том, что пришло событие QFileOpenEvent
  45 + * @param filename Имя файла
  46 + */
  47 + void openFileEvent(const QString & filename);
  48 +
  49 +private:
  50 + /**
  51 + * @brief Имя последнего файла, который пришел в QFileOpenEvent
  52 + */
  53 + QString m_lastOpenFilename;
  54 +};
  55 +
  56 +#endif // APPLICATION_H
... ...
src_qt/main.cpp
1 1 #include "mainwindow.h"
2   -#include <QApplication>
3 2 #include <QMenu>
  3 +#include "Application.h"
4 4  
5 5 #if defined (USE_STATIC_QJPEG)
6 6 Q_IMPORT_PLUGIN(qjpeg)
... ... @@ -11,7 +11,7 @@ Q_IMPORT_PLUGIN(qtiff)
11 11  
12 12 int main(int argc, char *argv[])
13 13 {
14   - QApplication a(argc, argv);
  14 + Application a(argc, argv);
15 15 MainWindow w;
16 16 #if defined (Q_OS_MAC)
17 17 void qt_mac_set_dock_menu(QMenu *menu);
... ... @@ -30,6 +30,11 @@ int main(int argc, char *argv[])
30 30 }
31 31 w.open_file(QString::fromLocal8Bit(filename.c_str()));
32 32 }
  33 + else if(a.hasLastOpenFilename())
  34 + {
  35 + w.open_file(a.getLastOpenFilename());
  36 + }
  37 + QObject::connect(&a, SIGNAL(openFileEvent(const QString &)), &w, SLOT(open_file(const QString &)));
33 38 w.show();
34 39 return a.exec();
35 40 }
... ...
src_qt/mainwindow.cpp
... ... @@ -116,7 +116,7 @@ void MainWindow::resizeEvent(QResizeEvent *event)
116 116 }
117 117  
118 118 // Открытие файла по имени
119   -void MainWindow::open_file(QString filename)
  119 +void MainWindow::open_file(const QString & filename)
120 120 {
121 121 // Запомним старые значения индексов, чтоб потом восстановить
122 122 size_t old_draw_index = ui->widget->draw_index;
... ...
src_qt/mainwindow.h
... ... @@ -30,13 +30,14 @@ public:
30 30 ~MainWindow();
31 31 // Событие при изменении размера окна
32 32 void resizeEvent(QResizeEvent *event);
33   - // Открытие файла по имени
34   - void open_file(QString filename);
35 33 // Пришло drag-and-drop сообщение
36 34 void dragEnterEvent(QDragEnterEvent * event);
37 35 void dragMoveEvent(QDragMoveEvent * event);
38 36 void dragLeaveEvent(QDragLeaveEvent * event);
39 37 void dropEvent(QDropEvent * event);
  38 +public slots:
  39 + // Открытие файла по имени
  40 + void open_file(const QString & filename);
40 41 private slots:
41 42 // Событие при открытии файла
42 43 void on_actionOpen_Tecplot_File_triggered();
... ...