Russian Qt Forum
Ноябрь 23, 2024, 14:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Контекстное меню (Windows) - путь  (Прочитано 29215 раз)
AlphaGh0St
Гость
« Ответ #30 : Ноябрь 22, 2012, 19:20 »

Как говориться "Всё гениальное-просто".
Сначала попробую сделать через QtSingleApplication, если не получится, то через QSharedMemory.

Не много погуглив, выясняется, что QtSingleApplication надо скачивать отдельно и добавлять.
Вот здесь http://code.google.com/p/cupsfilter/source/browse/trunk/vp_plugins/qt_single_apps/?r=948 нашёл файлы этого проекта.
Брать файлы от туда или где-то ещё?

В документации к классу есть пример:
Код:
 // Single instance
 int main(int argc, char **argv)
 {
     QtSingleApplication app(argc, argv);

     if (app.isRunning())
         return 0;

     MyMainWidget mmw;

     app.setActivationWindow(&mmw);

     mmw.show();
     return app.exec();
 }

Получается, можно сделать следующим образом: главное окно программы задаётся классом QMainWindow, можно добавить метод setDestPath(const QString &p); , который и будет получать новый путь флага и обновлять его в программе. А передавать этот новый путь можно в качестве первого аргумента (argv[1]).
Тогда решение будет следующим:
Код:
 // Single instance
 int main(int argc, char **argv)
 {
     QtSingleApplication app(argc, argv);
     QMainWindow mw;

     if (app.isRunning())
     {
         mw.setDestPath(argv[1]); // обновили путь
         return 0; // вышли
     }

     app.setActivationWindow(&mw);

     mw.show();
     return app.exec();
 }
Я правильно рассуждаю?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #31 : Ноябрь 22, 2012, 22:05 »

нет, неверно. когда app.isRunning() == true, это значит, что существует другая копия программы, у которой есть свой QMainWindow mw, а написанным кодом ты обращаешься к новому главному окну, а не к существующему.

вместо mw.setDestPath(argv[1]) тебе нужно писать app.sendMessage(QDir::currentPath()) — это отправит путь существующей копии приложения, которая испустит сигнал messageReceived, который и нужно ловить:
Код
C++ (Qt)
connect(this, SIGNAL(messageReceived(const QString &)), SLOT(setDestPath(const QString &)));
в данном случае this является отправителем, потому что ИМХО проще и лучше унаследоваться от QtSingleApplication и писать этот коннект внутри класса. но в принципе можно и прямо в main:
Код
C++ (Qt)
QObject::connect(&app, SIGNAL(messageReceived(const QString &)), &mw, SLOT(setDestPath(const QString &)));
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AlphaGh0St
Гость
« Ответ #32 : Ноябрь 22, 2012, 22:07 »

Да, верно, эт я не доглядел.
А от куда лучше QtSingleApplication взять?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #33 : Ноябрь 22, 2012, 22:10 »

с фтп Qt: ftp.qt.nokia.com/qt/solutions/lgpl/qtsingleapplication-2.6_1-opensource.zip (или .tar.gz версию)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #34 : Ноябрь 23, 2012, 00:53 »

Если "в двух словах", то нужно следующее: одна программа записывает в файл какую-либо строку, вторая программа (желательно, тут же) считывает эту строку из файла. Всё.
Проблема заключается в том, что вторая программа должна определить, был ли файл перезаписан, и если "да", то незамедлительно считать данные из файла.

Первое, что приходит в голову, это запустить дополнительный поток, который будет через определённый интервал времени (1 сек) проверять атрибуты файла (дату последней модификации). Если файл был перезаписан, скажем, более, чем 3 секунды назад, просигналить об этом.

Но, возможно, есть лучшее решение.
Тренировочных задач и готовых решений не надо, благодарю.

для этой задачи QFileSystemWatcher спасет отца русской демократии без всяких доп. потоков ) Без использования Qt для этого тоже есть инструменты, зависит от платформы, например для linux - epool + inotify, для винды не знаю, не занимался.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
AlphaGh0St
Гость
« Ответ #35 : Ноябрь 26, 2012, 17:39 »

Возник нубский вопрос.
Скачал ftp.qt.nokia.com/qt/solutions/lgpl/qtsingleapplication-2.6_1-opensource.zip и распаковал.
Выполнил configure.bat, qmake и make (Через QtCreator).
...а что дальше? Ещё ни разу не доводилось собирать компоненты в ручную.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #36 : Ноябрь 26, 2012, 18:17 »

там ничего собирать не нужно. просто берёшь исходники и добавляешь себе в проект.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AlphaGh0St
Гость
« Ответ #37 : Ноябрь 26, 2012, 19:36 »

Добавил, но компиляция не проходит, появляется аж 83 ошибки.
Сам QtCreator все файлы видит, обьект класса создаёт, методы видит, но не компилирует.
Уже всё проверил, и qmake несколько раз перезапускал, толку нет.

Ошибки вот такие:
Код:
qtsingleapplication.h:47: ошибка: QtGui/QApplication: No such file or directory
qtlocalpeer.h:48: ошибка: QtNetwork/QLocalServer: No such file or directory
qtlockedfile.h:50: ошибка: QtCore/QFile: No such file or directory
Подскажите, в чём проблема?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #38 : Ноябрь 26, 2012, 19:40 »

поубирай префиксы
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Ноябрь 26, 2012, 19:49 »

Вполне возможно что в данном случае QtSingleApplication ничуть не хуже обмена данными между 2 приложениями, а может и просто лучше (от задачи зависит). Однако этот путь сводится к "прикручиванию" чужих исходников, не считая нескольких строк их использования. Развивается умение "собирать",  "чего-то достать", попользоваться и.т.п. Это также необходимо и сейчас без этого не проживешь. Но все же это ближе к "продвинутому пользователю" чем к "программисту"  Улыбающийся
Записан
AlphaGh0St
Гость
« Ответ #40 : Ноябрь 26, 2012, 20:04 »

Поубирал префиксы, ничего не изменилось(
Файлы в проект включены, вроде всё нормально, не пойму, что упустил...

Сперва попробую через QtSingleApplication, не получится, тогда вернусь к первоначальной идеи (2 проги + IPC)
Записан
AlphaGh0St
Гость
« Ответ #41 : Ноябрь 27, 2012, 10:11 »

Создал тестовый проект, подключил все файлы, результат тот же, куча ошибок.
Посмотрите, пожалуйста, подскажите, что не так?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #42 : Ноябрь 27, 2012, 10:18 »

ну а модуль network кто за тебя будет подключать? Пушкин? Улыбающийся можно ж было в любом примере подсмотреть.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Ноябрь 27, 2012, 10:35 »

Я использую Xcode. Создал проект через qmake, ошибки линковки. Добавил в проект QtNetwork framework, все норм, работает, показывает ARE RUNNING. Правда второй запуск надо делать из отладчика или из консоли, просто так "вторую копию" не запустить - но это специфика OSX

kambala, я помню Вы с этим разбирались, почему так много всего наворочено в QtSingleApplication? Ну просто отследить достаточно неск строк опять-таки с QSharedMemory. Спасибо   
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #44 : Ноябрь 27, 2012, 10:44 »

в подробности реализации я не вдавался, но там используется QLocalSocket для «общения» с существующей копией.

для данной задачи создавать отдельное консольное приложение (пусть невидимое и живёт всего ничего), которое практически ничего не делает — избыточно по-моему.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 23.