Russian Qt Forum

Программирование => С/C++ => Тема начата: AlphaGh0St от Ноябрь 20, 2012, 22:47



Название: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 20, 2012, 22:47
Всем привет!
Задумка в следующем: добавил новый пункт контекстного меню по этой http://habrahabr.ru/post/79443/ (http://habrahabr.ru/post/79443/) статье.
Нужно написать простенькую и консольную программку, которая будет запускаться через добавленный пункт контекстного меню.
При запуске программа должна определить, от куда произошёл её запуск, т.е., предположим, пользователь выбрал новый пункт контекстного меню в "C:\Users", программа должна определить этот путь.

Подскажите, как это можно сделать? Как определить путь в таком случае?
Благодарю.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: mutineer от Ноябрь 20, 2012, 23:25
QString QDir::currentPath () проверял?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 21, 2012, 00:10
Цитировать
QString QDir::currentPath ()
В таком случае будет получен путь, по которому находится сам исполняемый файл (exe'шник), а нужно узнать путь, от куда пользователь вызвал контекстное меню.

Например, exe'шник может находится в C:\Program Files\Some program\pr.exe
А пользователь вызвал контекстное меню из другой директории, например, D:\Some dir.

Программа при запуске должна определить этот путь, в данном примере - это "D:\Some dir".


Название: Re: Контекстное меню (Windows) - путь
Отправлено: mutineer от Ноябрь 21, 2012, 00:36
Цитировать
QString QDir::currentPath ()
В таком случае будет получен путь, по которому находится сам исполняемый файл (exe'шник), а нужно узнать путь, от куда пользователь вызвал контекстное меню.

Например, exe'шник может находится в C:\Program Files\Some program\pr.exe
А пользователь вызвал контекстное меню из другой директории, например, D:\Some dir.

Программа при запуске должна определить этот путь, в данном примере - это "D:\Some dir".

Я понял что тебе нужно, но у меня нет возможности проверить что вернет currentPath при запуске из контекстного меню. currentPath возвращает не директорию с бинарником программы, а директорию, которая была текущей при запуске. А это не всегда одно и то же


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 21, 2012, 01:46
а в argv не сидит нужный путь?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 21, 2012, 15:56
QString QDir::currentPath () проверял?
Да, это сработало.
Всем спасибо за помощь!


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 21, 2012, 20:07
Чтобы не создавать ещё одну тему, спрошу здесь.
Суть этой (первой) программки в том, чтобы определять, от куда она была запущена через контекстное меню.
Программка определила путь, записала его (путь) в файл и завершилась, всё просто. Файл каждый раз открывается на перезапись.

Задача второй программы заключается в том, чтобы при записи нового пути, тут же этот путь из файла получить.
Планирую запустить новый поток, который будет через ...скажем каждую секунду проверять файл и если в файле записан новый путь, поток просигналит об этом основному потоку.

Возможно, есть способы по лучше, подскажите, как лучше реализовать такой обмен данными?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 21, 2012, 20:36
При запуске программа должна определить, от куда произошёл её запуск, т.е., предположим, пользователь выбрал новый пункт контекстного меню в "C:\Users", программа должна определить этот путь.
Может я чего-то не понял. Ну вот напр пользователь сидит в консоли и ввел руками полный путь. Потом сменил текущий каталог и опять ввел полный путь. В чем тогда смысл Вашего определения? Получить текущий каталог - и что с того?

Вообще такого рода "системные" задачи (завязанные на специфику) - на мой взгляд пустая трата времени. Все уходит в познание/изучение той "специфики" - а толку чуть. Хотите потренироваться - я Вам дам задачку  :)


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 21, 2012, 21:16
AlphaGh0St напишите что вы хотите получить в конце. Вашу конечную цель опишите.

Возможно вам нужно что-то уже готовое и уже кем то реализованное?


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

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

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


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

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

Но, возможно, есть лучшее решение.
Это подходит под логику семафора. Напр приложение запущено и и ему надо отловить были ли еще попытки запуска того же приложения


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 21, 2012, 22:07
почему нельзя «сообщить» (через inter-process communication) другой программе эту строку напрямую, без всяких файлов? а другая программа просто сверит новые данные с текущими.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 21, 2012, 22:34
Вы не цель сообщили, а ту часть, про которую хотите спросить.

Цель у вас какая?

Взаимодействие между приложениями?  Работа с файлами? Отслеживание изменения файла? Клиент аськи? Операционная система?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 21, 2012, 22:57
почему нельзя «сообщить» (через inter-process communication) другой программе эту строку напрямую, без всяких файлов? а другая программа просто сверит новые данные с текущими.
Отличная идея!! Подскажите, как это сделать? Что можно почитать на эту тему? Программы под винду, обе на Qt.

Цель: программа копирования файлов.
Пользователь в нужном месте кликает ПКМ, в контекстном меню выбирает пункт типа "Установить флаг копирования".
Затем в саму программу копирования (в виде очереди) можно добавлять файлы и эти файлы будут копироваться туда, где установлен флаг.

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

Идея с межпроцессорным взаимодействием мне нравится больше.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 21, 2012, 23:21
я в этом не силен, но по идее тебе нужен QLocalSocket или QProcess

а вообще, если цель этой консольной программы — лишь подсунуть правильный путь, то почему нельзя этот путь направлять сразу в основную программу из контекстного меню проводника?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 22, 2012, 06:56
Я бы вам идею подрезал, ооох как подрезал :)

Начнём - убираем две программы, оставляем одну.

Второе - добавляем 2 пункта в контекстное меню проводника с разными параметрами коммандной строки.

Третье - вместо гипотетического файла пишем данные в реестр/файл настроек вашей программы.

Что имеем? Одна программа с разной обработкой коммандных строк. Одна обработка записывает строку в реестр/файл. Вторая копирует файло.

Вот и всё. К тому же насколько я помню - в параметры командной строки при вызове контекстного меню вся нужная информация передаётся. Начиная от текущего каталога и заканчивая файлом на котором щёлкнули.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 22, 2012, 09:17
Приложение-приемник создает QSystemSemaphore и запускает нитку которая висит на нем (acquire). Приложение для выбора целевого фолдера создает QSystemSemaphore с тем же именем и делает ему release. В результате приемник снимается с семафора, как бы получает сигнал "целевой фолдер изменен". Сам путь проще всего передать через QSharedMemory


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 22, 2012, 09:52
Как говорится - зачем 2 программы? достаточно и одной как бы :) А уже внутри одной можно творить всё что угодно.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 12:27
Начнём - убираем две программы, оставляем одну.

Второе - добавляем 2 пункта в контекстное меню проводника с разными параметрами коммандной строки.
если я правильно понял, Вы предлагаете программе копирования передавать параметры в качестве входных аргументов (argv)?
проблемка в том, что программа копирования может быть запущена на долгое время, а за это время, флаг может много раз измениться. Нужно изменять флаг во время работы программы копирования.

Цитировать
Третье - вместо гипотетического файла пишем данные в реестр/файл настроек вашей программы.
в реестр лучше лишний раз не лазить, т.к. в win 7 для доступа к реестру требуются права админа. А если программа каждый раз будет надоедать пользователю запросами (выполнить от имени админа), это очень быстро надоест.
как правило, программа инсталлируется в C:\Program files , файл настроек лежит там-же, и для его изменения так же требуются права админа.
тут я вышел из ситуации так: по переменной окружения TMP определяю каталог временных файлов пользователя, там создаю файлик и туда же пишу путь флага.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 12:31
а вообще, если цель этой консольной программы — лишь подсунуть правильный путь, то почему нельзя этот путь направлять сразу в основную программу из контекстного меню проводника?
Это было бы кстати, но вот как это сделать?
Bepec, если я правильно понял, предложил передавать путь в качестве входного аргумента, но так, к сожалению, сделать не получится.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: mutineer от Ноябрь 22, 2012, 12:32
как правило, программа инсталлируется в C:\Program files , файл настроек лежит там-же, и для его изменения так же требуются права админа.

Это порочная, исторически сложившаяся практика. Файлик настроек должен лежать в домашней директории пользователя


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 22, 2012, 12:43
Кхм. Пара слабых моментов у вас, AlphaGh0st.
1) Изменения в реестре в разделе настроек программ, НЕ требуют прав админа. Права нужны только для системных секций.
2) У вас программа копирования может единомоментно менять место копирования файлов? Т.е. полфильма на старый флаг, полфильма на новый (фильм для примера).
3) У вас цель конечная какая? КОНЕЧНАЯ. Не "две программы бла бла бла", а "приложение, которое копирует файлы из папки пользователя в папку с указанным флагом непрерывно 24 часа в сутки, отрывая кусок за куском у исходных файлов и кладя их в папку с флагом."
4) Озвучьте наконец свою идею блин. Результат, который сделает вас создателем гениальной программы.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 22, 2012, 13:44
а вообще, если цель этой консольной программы — лишь подсунуть правильный путь, то почему нельзя этот путь направлять сразу в основную программу из контекстного меню проводника?
Это было бы кстати, но вот как это сделать?
Bepec, если я правильно понял, предложил передавать путь в качестве входного аргумента, но так, к сожалению, сделать не получится.
QtSingleApplication в помощь. Щёлкнул на команду меню в проводнике — совершается попытка запустить твоё приложение — отсылаешь (QtSingleApplication это позволяет) QDir::currentPath() существующей копии.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 22, 2012, 13:46
тут я вышел из ситуации так: по переменной окружения TMP определяю каталог временных файлов пользователя, там создаю файлик и туда же пишу путь флага.
Зачем связываться с временными файлами и быть зависимым от платформы? Да и циклическая проверка а не изменился ли файл хорошего впечатления не производит


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 22, 2012, 14:27
Igors в связи с названием темы, ваше замечание насчёт привязки к платформе... Ну вы поняли :)


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 15:44
4) Озвучьте наконец свою идею блин. Результат, который сделает вас создателем гениальной программы.
Да, собственно, ничего гениального здесь нет.
Программа копирования файлов. Через контекстное меню пользователь устанавливает флаг. В самой программе копирования есть очередь копирования, после установки флага, пользователь добавляет в эту очередь файлы и они копируются туда, где установлен флаг.

Если в процессе копирования флаг изменился, то копируемый файл будет докопирован по старому пути, а все последующие файлы будут копироваться по новому пути.

Работать программа будет столько, сколько потребуется пользователю. Пользователь может за 5 минут скопировать нужные файлы и закрыть программу. А может копировать их часами.

QtSingleApplication в помощь. Щёлкнул на команду меню в проводнике — совершается попытка запустить твоё приложение — отсылаешь (QtSingleApplication это позволяет) QDir::currentPath() существующей копии.
не уверен, что этот метод подойдёт, т.к. при каждой новой установке флага, программа копирования будет запускаться заново.
а это значит, что придётся добавлять файлы в очередь копирования заново.

Зачем связываться с временными файлами и быть зависимым от платформы?
...хм...возможно, я чего-то не понял, но почему появляется зависимость от платформы?
файлик хранится во временной директории, путь к которой извлекается из переменной окружения TMP.
в Винде эта переменная укажет один путь, а в Линуксе - другой.

Цитировать
Да и циклическая проверка а не изменился ли файл хорошего впечатления не производит
согласен


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 16:06
Я как думал: Из контекстного меню можно запустить программу. Так почему бы не написать маленькую, вспомогательную программку, которая и будет запускаться, а при запуске передавать программе копирования путь к флагу.

Идея с передачей пути через файл, не самая лучшая.
Передавать путь к флагу в качестве входного аргумента, видимо, тоже не вариант.

Идея с межпроцессорным взаимодействием мне понравилась гораздо больше.
Документацию по вышесказанным классам найти не проблема, но почему-то не нашёл примера использования.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 22, 2012, 16:10
Цитировать
не уверен, что этот метод подойдёт, т.к. при каждой новой установке флага, программа копирования будет запускаться заново.
с чего вдруг она будет запускаться заново, если QtSingleApplication не даст новой копии появиться, а существующая сделает что надо с пришедшим путём?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 22, 2012, 17:08
Идея с межпроцессорным взаимодействием мне понравилась гораздо больше.
Документацию по вышесказанным классам найти не проблема, но почему-то не нашёл примера использования.
У Вас совершенно стандартная ситуация - одно приложение должно передать "немного данных" другому. Столь же стандартное решение - обмен через QSharedMemory, обычно с использованием семафоров

Оба приложения создают QSharedMemory с одним и тем же ключом, в результате оба могут читать/писать физически тот же блок памяти. Синхронизация - через семафор (см выше), но если так нравится - можно в цикле читать (все лучше чем файл) 


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 22, 2012, 17:43
я всё равно не понимаю зачем в данном случае нужно 2 приложения


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 19:20
Как говориться "Всё гениальное-просто".
Сначала попробую сделать через QtSingleApplication, если не получится, то через QSharedMemory.

Не много погуглив, выясняется, что QtSingleApplication надо скачивать отдельно и добавлять.
Вот здесь http://code.google.com/p/cupsfilter/source/browse/trunk/vp_plugins/qt_single_apps/?r=948 (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();
 }
Я правильно рассуждаю?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 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 &)));


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 22, 2012, 22:07
Да, верно, эт я не доглядел.
А от куда лучше QtSingleApplication взять?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 22, 2012, 22:10
с фтп Qt: ftp.qt.nokia.com/qt/solutions/lgpl/qtsingleapplication-2.6_1-opensource.zip (или .tar.gz версию)


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

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

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

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


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 26, 2012, 17:39
Возник нубский вопрос.
Скачал ftp.qt.nokia.com/qt/solutions/lgpl/qtsingleapplication-2.6_1-opensource.zip (http://ftp.qt.nokia.com/qt/solutions/lgpl/qtsingleapplication-2.6_1-opensource.zip) и распаковал.
Выполнил configure.bat, qmake и make (Через QtCreator).
...а что дальше? Ещё ни разу не доводилось собирать компоненты в ручную.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 26, 2012, 18:17
там ничего собирать не нужно. просто берёшь исходники и добавляешь себе в проект.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 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
Подскажите, в чём проблема?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 26, 2012, 19:40
поубирай префиксы


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 26, 2012, 19:49
Вполне возможно что в данном случае QtSingleApplication ничуть не хуже обмена данными между 2 приложениями, а может и просто лучше (от задачи зависит). Однако этот путь сводится к "прикручиванию" чужих исходников, не считая нескольких строк их использования. Развивается умение "собирать",  "чего-то достать", попользоваться и.т.п. Это также необходимо и сейчас без этого не проживешь. Но все же это ближе к "продвинутому пользователю" чем к "программисту"  :)


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 26, 2012, 20:04
Поубирал префиксы, ничего не изменилось(
Файлы в проект включены, вроде всё нормально, не пойму, что упустил...

Сперва попробую через QtSingleApplication, не получится, тогда вернусь к первоначальной идеи (2 проги + IPC)


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 27, 2012, 10:11
Создал тестовый проект, подключил все файлы, результат тот же, куча ошибок.
Посмотрите, пожалуйста, подскажите, что не так?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 10:18
ну а модуль network кто за тебя будет подключать? Пушкин? :) можно ж было в любом примере подсмотреть.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Igors от Ноябрь 27, 2012, 10:35
Я использую Xcode. Создал проект через qmake, ошибки линковки. Добавил в проект QtNetwork framework, все норм, работает, показывает ARE RUNNING. Правда второй запуск надо делать из отладчика или из консоли, просто так "вторую копию" не запустить - но это специфика OSX

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


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 10:44
в подробности реализации я не вдавался, но там используется QLocalSocket для «общения» с существующей копией.

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


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 27, 2012, 15:45
Подключил модуль network, qmake выполнил, пересобрал проект, ничего не изменилось.
kambala, у Вас после подключения network проект скомпилировался? Можете сюда проект выложить?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: Bepec от Ноябрь 27, 2012, 15:50
У меня странное чуйство, что у меня всё соберётся с 1 попытки, но я пока помолчу и продолжу наблюдать :)


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 16:47
Подключил модуль network, qmake выполнил, пересобрал проект, ничего не изменилось.
kambala, у Вас после подключения network проект скомпилировался? Можете сюда проект выложить?
1. скачал приложенный к посту проект
2. распаковал, открыл в креаторе, нажал «построить» (молоток в левом нижнем углу), получил тонну ошибок
3. открыл .pro, дописал network в QT +=
4. снова нажал «построить» — завершилось успешно


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 27, 2012, 17:09
Не поверите, делал тоже самое, вот файл проекта:
Код:
#-------------------------------------------------
#
# Project created by QtCreator 2012-11-26T19:54:12
#
#-------------------------------------------------

QT       += core gui network

TARGET = untitled
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    qtsingleapplication/qtsinglecoreapplication.cpp \
    qtsingleapplication/qtsingleapplication.cpp \
    qtsingleapplication/qtlockedfile_win.cpp \
    qtsingleapplication/qtlockedfile_unix.cpp \
    qtsingleapplication/qtlockedfile.cpp \
    qtsingleapplication/qtlocalpeer.cpp

HEADERS  += mainwindow.h \
    qtsingleapplication/qtsinglecoreapplication.h \
    qtsingleapplication/qtsingleapplication.h \
    qtsingleapplication/QtSingleApplication \
    qtsingleapplication/qtlockedfile.h \
    qtsingleapplication/QtLockedFile \
    qtsingleapplication/qtlocalpeer.h

FORMS    += mainwindow.ui



Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 18:26
очисти проект и руками поудаляй все остатки от сборки, потом собери.

так а ошибки по-прежнему связаны с QLocalSocket и подобным?


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 27, 2012, 19:28
Всё очистил, пересобрал, опять ошибки.
Ошибки не только с QLocalSocket связаны, там много чего, жалуется на всё, что не лень.
Код:
qtsingleapplication.h:82: ошибка: 'QString' does not name a type
qtsingleapplication.h:84: ошибка: 'QWidget' has not been declared
qtsingleapplication.h:85: ошибка: expected ';' before '*' token
qtsingleapplication.h:89: ошибка: 'Q_UNUSED' was not declared in this scope

qtlockedfile.h:77: ошибка: expected ',' or '...' before '&' token
qtlocalpeer.h:58: ошибка: ISO C++ forbids declaration of 'Q_OBJECT' with no type

qtsingleapplication.cpp:145: ошибка: 'appId' was not declared in this scope
qtsingleapplication.cpp:173: ошибка: ISO C++ forbids declaration of 'QString' with no type
И ещё очень много на что жалуется.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 20:29
а другие проекты (без qtsingleapplication) компилируются? складывается впечатление, что не задана QTDIR.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 27, 2012, 21:55
да, другие проекты компилируются


Название: Re: Контекстное меню (Windows) - путь
Отправлено: kambala от Ноябрь 27, 2012, 22:47
если используешь вижуал студию (именно среду, а не просто компилятор), то там возникает странный баг при добавлении qtsingleapplication в проект. как с ним справиться я описывал в теме по qtsingleapplication. но в креаторе никаких проблем быть не должно. даже и не знаю что ещё подсказать…


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 28, 2012, 12:49
Действительно, странно.
Создал новый проект, перенёс исходники туда, и всё замечательно собралось с первого раза.


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 28, 2012, 14:56
Не могу поверить, я просто не могу в это поверить!
Перед сборкой очистил проект, выполнил qmake, и опять всё сломалось!
Да что ж такое...


Название: Re: Контекстное меню (Windows) - путь
Отправлено: AlphaGh0St от Ноябрь 28, 2012, 17:03
Странность за странностью.
Как решил эту проблему:
1) удалил из проекта все файлы QtSingleApplication
2) из .pro файла удалил network
3) в main.cpp закомментировал все упоминания о QtSingleApplication
4) запустил сборку, проект собрался нормально
5) добавил в .pro файл network
6) добавил в проект файлы QtSingleApplication
7) пересобрал - всё норм.

Всё заработало, как надо, проблем не наблюдается.
Всем спасибо за помощь, особенно kambala! ))