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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Почему падает тестовое приложение  (Прочитано 8433 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Апрель 08, 2015, 13:00 »

Только вчера за это тоже получил получил по дюнделю Улыбающийся Как они сами объясняют - потому что число аргументов может меняться. Да, может, напр я зарядил имя файла (одного) в командной строке. На старте в командной строке получаю ... 4 параметра.

1) Полное имя приложения
2) Имя файла что я дал
3) Какая-то лабуда типа -хххDebug
4) "YES"

Когда запустился цикл событий мне пришло событие QEvent::OpenFile и теперь остался 1 аргумент. Хммм... ну ладно, а  как мне самому, "до того" убрать/отфильтровать весь этот хлам из командной строки?
Записан
andrew.k
Гость
« Ответ #16 : Апрель 08, 2015, 14:33 »

Только вчера за это тоже получил получил по дюнделю Улыбающийся Как они сами объясняют - потому что число аргументов может меняться. Да, может, напр я зарядил имя файла (одного) в командной строке. На старте в командной строке получаю ... 4 параметра.

1) Полное имя приложения
2) Имя файла что я дал
3) Какая-то лабуда типа -хххDebug
4) "YES"

Когда запустился цикл событий мне пришло событие QEvent::OpenFile и теперь остался 1 аргумент. Хммм... ну ладно, а  как мне самому, "до того" убрать/отфильтровать весь этот хлам из командной строки?

Ну так видимо, до того, как до него доберется Qt. До создания QApplication.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Апрель 08, 2015, 14:46 »

Ну так видимо, до того, как до него доберется Qt. До создания QApplication.
Когда QApplication создано - мусор в командной строке еще торчит, И когда, по каким правилам оно его вычищает - хз
Записан
andrew.k
Гость
« Ответ #18 : Апрель 08, 2015, 14:46 »

В синглтонах конструктор делают приватным и работают через SingletonClassName::instance()->someMethod().
QApplication тоже синглтон, но конструктор там не приватный.
Записан
andrew.k
Гость
« Ответ #19 : Апрель 08, 2015, 15:00 »

Ну так видимо, до того, как до него доберется Qt. До создания QApplication.
Когда QApplication создано - мусор в командной строке еще торчит, И когда, по каким правилам оно его вычищает - хз
Судя по исходникам, аргументы удаляются в конструкторе QApplication

Код
C++ (Qt)
void QApplicationPrivate::process_cmdline()
{
   // process platform-indep command line
   if (!qt_is_gui_used || !argc)
       return;
 
   int i, j;
 
   j = 1;
   for (i=1; i<argc; i++) { // if you add anything here, modify QCoreApplication::arguments()
       if (argv[i] && *argv[i] != '-') {
           argv[j++] = argv[i];
           continue;
       }
       QByteArray arg = argv[i];
       if (arg.startsWith("--"))
           arg.remove(0, 1);
       QString s;
       if (arg == "-qdevel" || arg == "-qdebug") {
           // obsolete argument
       } else if (arg.indexOf("-style=", 0) != -1) {
           s = QString::fromLocal8Bit(arg.right(arg.length() - 7).toLower());
       } else if (arg == "-style" && i < argc-1) {
           s = QString::fromLocal8Bit(argv[++i]).toLower();
#ifndef QT_NO_STYLE_STYLESHEET
       } else if (arg == "-stylesheet" && i < argc -1) {
           styleSheet = QLatin1String("file:///");
           styleSheet.append(QString::fromLocal8Bit(argv[++i]));
       } else if (arg.indexOf("-stylesheet=") != -1) {
           styleSheet = QLatin1String("file:///");
           styleSheet.append(QString::fromLocal8Bit(arg.right(arg.length() - 12)));
#endif
       } else if (qstrcmp(arg, "-widgetcount") == 0) {
           widgetCount = true;
       } else {
           argv[j++] = argv[i];
       }
       if (!s.isEmpty()) {
           if (app_style) {
               delete app_style;
               app_style = 0;
           }
           styleOverride = s;
       }
   }
 
   if(j < argc) {
       argv[j] = 0;
       argc = j;
   }
}
 


Код
C++ (Qt)
void QApplicationPrivate::construct()
{
   initResources();
 
   qt_is_gui_used = (application_type != QApplicationPrivate::Tty);
   process_cmdline();
....
 

Код
C++ (Qt)
#ifdef Q_QDOC
QApplication::QApplication(int &argc, char **argv)
#else
QApplication::QApplication(int &argc, char **argv, int _internal)
#endif
   : QGuiApplication(*new QApplicationPrivate(argc, argv, _internal))
{ Q_D(QApplication); d->construct(); }
 

Эксперимент это подтверждает. -style test.qss исчез из аргументов, после создания экземпляра QApplication, до запуска очереди событий.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 09, 2015, 08:24 »

Эксперимент это подтверждает. -style test.qss исчез из аргументов, после создания экземпляра QApplication, до запуска очереди событий.
А у меня не подтверждает - печатаю qApp->arguments из своего констуктора, стало быть конструктор QApplication уже отработал.
Записан
andrew.k
Гость
« Ответ #21 : Апрель 09, 2015, 15:31 »

Эксперимент это подтверждает. -style test.qss исчез из аргументов, после создания экземпляра QApplication, до запуска очереди событий.
А у меня не подтверждает - печатаю qApp->arguments из своего констуктора, стало быть конструктор QApplication уже отработал.
Возможно "Ты просто не умеешь их готовить" (с) Улыбающийся
Qt 5.2.1 Ubuntu

Код:
Код
C++ (Qt)
#include <iostream>
#include <QApplication>
#include <QtDebug>
 
void printArgs(int argc, char *argv[])
{
       std::cout << "argc = " << argc << std::endl;
       for(int i = 0; i < argc; ++i)
               std::cout << "argv[" << i << "]=" << argv[i] << std::endl;
       std::cout << std::endl;
}
 
int main(int argc, char *argv[])
{
       printArgs(argc, argv);
       QApplication a(argc, argv);
       printArgs(argc, argv);
       qDebug() << a.arguments();
       return 0;
}
 

Вывод:
Код
Bash
andrew@fastback:~/projects/testargs$ ./testargs -style test.qss
argc = 3
argv[0]=./testargs
argv[1]=-style
argv[2]=test.qss
 
argc = 1
argv[0]=./testargs
 
("./testargs")
 
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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