Russian Qt Forum

Qt => Общие вопросы => Тема начата: Zmey от Сентябрь 28, 2006, 13:33



Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 13:33
Возможно ли написать приложение, которое, в зависимости от переданных параметров командной строки, либо показывает GUI-окно, либо ведет себя как консольное. Вот этот код не выводит текст в стандартный вывод.
Код:
include <iostream>
#include "MainWindow.h"

int main(int argc, char **argv)
{
bool gui = false;//здесь будет разбор параметров

QApplication app(argc, argv);

if (gui)
{

MainWindow window;
window.show();

return app.exec();
}
else
{
std::cout << "text";

return 0;
}
}


Название: GUI / console одновременно
Отправлено: bigirbis от Сентябрь 28, 2006, 13:41
Если это происходит под виндой, то в Visual Studio стандартный вывод херится. Тогда можно запустить проект из консоли.


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 13:49
Запускал из консоли, никакого вывода.


Название: GUI / console одновременно
Отправлено: bigirbis от Сентябрь 28, 2006, 13:54
Создай для консоли QCoreApplication


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 14:02
Так?
Код:
#include <iostream>
#include "MainWindow.h"

int main(int argc, char **argv)
{
bool gui = false;

if (gui)
{
QApplication app(argc, argv);

MainWindow window;
window.show();

return app.exec();
}
else
{
QCoreApplication app(argc, argv);
std::cout << "text";

return 0;
}
}


Один хер, никакой разницы.


Название: GUI / console одновременно
Отправлено: Dendy от Сентябрь 28, 2006, 14:05
Практика показьІвает, что под виндой лучше не пользоваться консолью в GUI-приложениях.

Создай гуёвое окно для консоли и перенаправляй весь поток вьІвода туда.

...
Так не получится.
Всё равно приложение будет слинковано с QtGui, а точка входа будет в WinMain в случае виндьІ.


Название: GUI / console одновременно
Отправлено: Tonal от Сентябрь 28, 2006, 14:07
В винде, у запускаемого файла есть флажек - GUI или консоль.
Это регулируется параметрами линкера.
Для GUI-я винда консоли не создаёт, а rtl, не связывает stdin, stdout, stderr с осёвыми хенделами.

Принципиально несколько решений:
1) Создавать консольное приложение, и забить на консоль, которая инагда появлякется, или грохать её за ненадовнастью.
2) Создать GUI-евое приложение, и в случае надобности создавать ей консоль.
После чего привязывать к ей stdin, stdout, stderr.
3) Если консольный режим нужен только для пайпов, то создать GUI-евое приложение и привязывать stdin, stdout, stderr к их хенделам.


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 14:42
Цитата: "Tonal"
В винде, у запускаемого файла есть флажек - GUI или консоль.
Это регулируется параметрами линкера.
Для GUI-я винда консоли не создаёт, а rtl, не связывает stdin, stdout, stderr с осёвыми хенделами.

А самим можно их связать?
Цитата: "Tonal"

Принципиально несколько решений:
1) Создавать консольное приложение, и забить на консоль, которая инагда появлякется, или грохать её за ненадовнастью.

Как ее грохнуть?
Цитата: "Tonal"

2) Создать GUI-евое приложение, и в случае надобности создавать ей консоль.
После чего привязывать к ей stdin, stdout, stderr.

Если я запускаю приложение из консоли, а потом создаю консоль сам, то весь текст выводится в мою созданную консоль, а надо в консоль, из которой я запустил приложение.
Цитата: "Tonal"

3) Если консольный режим нужен только для пайпов, то создать GUI-евое приложение и привязывать stdin, stdout, stderr к их хенделам.

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


Название: GUI / console одновременно
Отправлено: bigirbis от Сентябрь 28, 2006, 15:11
Вот такую вещь в хелпе надыбал:
Цитировать
bool QFile::open ( FILE * fh, OpenMode mode )
This is an overloaded member function, provided for convenience.
Opens the existing file handle fh in the given mode. Returns true if successful; otherwise returns false.
Example:
    #include <stdio.h>

    void printError(const char* msg)
    {
        QFile file;
        file.open(stderr, QIODevice::WriteOnly);
        file.write(msg, qstrlen(msg));        // write to stderr
        file.close();
    }
When a QFile is opened using this function, close() does not actually close the file, but only flushes it.
Warning: If fh is stdin, stdout, or stderr, you may not be able to seek(). See QIODevice::isSequentialAccess() for more information.


Название: GUI / console одновременно
Отправлено: aros от Сентябрь 28, 2006, 16:07
Насколько я помню, в документаций написано, для того что бы получилась консоль нужно
QApplication app(argc, argv, false);
добовляеться обязательно еще один параметр и он должен быть false


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 16:12
Документация:
QApplication::QApplication ( int & argc, char ** argv, bool GUIenabled )
Constructs an application object with argc command line arguments in argv. If GUIenabled is true, a GUI application is constructed, otherwise a non-GUI (console) application is created.
Set GUIenabled to false for programs without a graphical user interface that should be able to run without a window system.
On X11, the window system is initialized if GUIenabled is true. If GUIenabled is false, the application does not connect to the X server. On Windows and Macintosh, currently the window system is always initialized, regardless of the value of GUIenabled. This may change in future versions of Qt.

Как раз таки Windows and Macintosh необходимы.


Название: GUI / console одновременно
Отправлено: Вячеслав от Сентябрь 28, 2006, 19:06
Цитата: "Zmey"

Нужно так: есть параметры командной строки - отрабатывает функция в соответствие с этими параметрами, закрывается прога. При этом во время работы выводятся логи на экран.
Нет параметров - показываем GUI окно.

Гы ! А что мешает (при наличии параметров) сварганить что-нибудь типа QTextBrowser  и сунуть его основным виждетом(и менюху с кнопарем "Идем в Бабруйск(quit)") ? или stdin таки нужен ?


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 28, 2006, 19:59
Ну можно конечно... Но это все обходные маневры... А если пользователь захочет перенаправить стандартный вывод в файл?


Название: GUI / console одновременно
Отправлено: xvadim от Сентябрь 28, 2006, 20:49
Цитата: "Zmey"

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


А если сделать вде версии прораммы: консольную и графическую? А пользователь пусть вызывает нужную.


Название: GUI / console одновременно
Отправлено: Вячеслав от Сентябрь 28, 2006, 23:09
Цитата: "Zmey"
Ну можно конечно... Но это все обходные маневры... А если пользователь захочет перенаправить стандартный вывод в файл?

Сам же  говоришь - есть ключи ;) --output-file=xxxx и вперед ;)


Название: GUI / console одновременно
Отправлено: fanat9 от Сентябрь 28, 2006, 23:09
В документации говорится что для консольного приложения под виндой нужно компилить с особым флагом:
QMAKE_LFLAGS_CONSOLE
This is used on Windows only.
This variable contains link flags when building console programs. The value of this variable is typically handled by qmake or qmake.conf and rarely needs to be modified.

И действительно при добавлении этого флага(и компиляции), при старте программы возникает окно консоли. Как переключаться это вопрос...


Название: GUI / console одновременно
Отправлено: Вудруф от Сентябрь 29, 2006, 07:08
Присоединяюсь к xvadim: лучше сделать две версии программы. Или одну (консольную) со всей функциональностью, и одну как GUI-оболочку над первой программой.


Название: GUI / console одновременно
Отправлено: Tonal от Сентябрь 29, 2006, 07:43
Смотри Console Reference в MSDN-е.
Семейство функций AllocConsole, AttachConsole, FreeConsole.

Насчёт перепривязки стандартных файлов примерно так:
Код:
  ::AllocConsole();
  freopen("CONOUT$", "wt", stdout);
  freopen("CONIN$", "rt", stdin);


Название: GUI / console одновременно
Отправлено: bigirbis от Сентябрь 29, 2006, 09:44
А ларчик просто открывался (я проверил на практике). Читай ссылку (хоть она и старая, но работает):
http://lists.trolltech.com/qt-interest/2000-10/msg00520.html


Название: GUI / console одновременно
Отправлено: Zmey от Сентябрь 29, 2006, 11:01
Две версии программы - слишком уж половой изврат... Но тоже вариант.
bigirbis,
Эту ссылку я уже читал и комментировал:
Цитировать
Если я запускаю приложение из консоли, а потом создаю консоль сам, то весь текст выводится в созданную мной консоль, а надо в консоль, из которой я запустил приложение.


Видимо, полностью переключиться между GUI/console во время старта невозможно. Спасибо, несколько workaround'ов подсказали, будем решать.


Название: GUI / console одновременно
Отправлено: bigirbis от Сентябрь 29, 2006, 11:14
В этом случае не создается дополнительной консоли. Приложение было гуевым. Я запустил его в фаре и стандарные вывод был на консоли фара.

добавлено спустя 6 минут:

 С консольным приложением тоже самое, просто его нужно запускать не из IDE а из консоли...


Название: GUI / console одновременно
Отправлено: xvadim от Сентябрь 29, 2006, 19:05
Цитата: "Zmey"
Две версии программы - слишком уж половой изврат... Но тоже вариант.

Почему половой? Самый нормальный. При твоем подходе необходимы:
[list=]код для консольной части[/list]
[list=]код для GUI[/list]
[list=]код для переключения между консолью и GUI[/list]
При раздельных программах последний пунт не нужен. "Зачем платить больше"   :)
Общую функциональность можно вообще вынести в DLL.


Название: GUI / console одновременно
Отправлено: bigirbis от Октябрь 01, 2006, 12:04
Если выставить указанный в статье флаг:
http://lists.trolltech.com/qt-interest/2000-10/msg00520.html
то не понадобится разбивать данную задачу на два приложения, ведь именно этого и хочет Zmey.
Зачем городить?


Название: GUI / console одновременно
Отправлено: Zmey от Октябрь 02, 2006, 11:26
bigirbis, какой флаг? Что то не понимаю, что ты имеешь в виду.
Еще покажи, пожалуйста, код, который у тебя работает.


Название: GUI / console одновременно
Отправлено: bigirbis от Октябрь 02, 2006, 11:41
Код:
int main(int argc, char *argv[])
{
QCoreApplication a( argc, argv );
std::cout << "console application" << std::endl;
return a.exec();
}

Флаг: Linker/System/SubSystem=Console(/SUBSYSTEM:CONSOLE)


Название: GUI / console одновременно
Отправлено: Zmey от Октябрь 02, 2006, 11:56
С этим кодом может и не будет проблем. Но, библиотека Qt иногда выводит всякие сообщения в консоль. Например у меня: "QMainWindow::restoreState: Cannot restore a QToolBar with an empty 'objectName'". Поэтому с этим флагом я при запуске получаю 2 окна: мое GUI окно и консоль.


Название: GUI / console одновременно
Отправлено: bigirbis от Октябрь 02, 2006, 12:11
Попробуй поиграться qInstallMsgHandler


Название: GUI / console одновременно
Отправлено: Zmey от Октябрь 02, 2006, 14:41
bigirbis, невнимательно посмотрел на твой код. Конечно с ним нет проблем. Ведь у тебя не GUI программа.
А ты выполни эту программу с флагом и из проводника:
Код:
int main(int argc, char **argv) 
{
QApplication app(argc, argv);
MainWindow window;
window.show();

return app.exec();
}

У меня, если Qt и не выводит месаги - левое окно консоли есть и оно пустое.


Название: GUI / console одновременно
Отправлено: bigirbis от Октябрь 02, 2006, 14:48
Код:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestTextEdit w;
w.show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));

std::cout << "console application" << std::endl;

return a.exec();
}

Вот такой код (с тем же флагом линкера) при выполнении из проводника выдает гуевый элемент и консольку на которой тут же отображается "console application".

Не думаю, что будет очень тяжело совместить 2 этих кода.