2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
1

Консоль и Qt. Возможность работать как через консоль так и через графический интерфейс

10.05.2016, 14:59. Показов 2783. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может кто-то знает... Как в одном и том же приложении совместить возможность запуска и через консоль и через разработанный через Qt графический интерфейс? Чтобы можно было запускать и так и так...Как это совместить?
На данный момент есть приложение, которое может архивировать и дезархивировать файлы и через консоль и через графический интерфейс. Изменения как будет все работать есть только в main.cpp. Если закоментировать одно, то работает через консоль и наоборот. А как совместить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "zipper.h"
#include <QtWidgets/QApplication>
#include <ctime>
 
int main(int argv, char *argc[])
{
setlocale(LC_ALL,"Russian");
QApplication a(argv, argc);
    
Zipper w;
w.show();
    
/*  Node Wood;
    Hoffman Нoff;
        
    std::cout<<std::endl<<"######################## ZIPPER ########################"<<std::endl<<std::endl;
 
    if(argv>1)
    {//-pack -files C:\test\text1.txt C:\test\text2.txt C:\test\text3.txt -path C:\test -name proba
        //  -unpack -files C:\test\proba.bin -path C:\test\unpack
        std::vector<std::string> files;
        std::string path = "";
        std::string name ="";
        bool flag_fs = false, flag_path = false, flag_name= false;
        char type[7];
        memset(type,0,7);
        for(int i=1;i<argv;i++)
        {
            if(strcmp(argc[i],"-pack")==0) { strcpy(type,"pack"); flag_fs=flag_path=flag_name=false;}
            if(strcmp(argc[i],"-unpack")==0) { strcpy(type,"unpack"); flag_fs=flag_path=flag_name=false;}
            if(strcmp(argc[i],"-path")==0) {flag_path=true; flag_fs=false; flag_name= false; continue; }
            if(strcmp(argc[i],"-files")==0) {flag_fs=true; flag_path=false; flag_name= false; continue; }
            if(strcmp(argc[i],"-name")==0) {flag_name= true;flag_fs=false; flag_path=false; continue; }
 
            if(flag_path) {path.assign(argc[i]); }
            if(flag_fs) files.push_back(std::string(argc[i]));
            if(flag_name) {name.assign(argc[i]); }
        }
        Package *zip = new Package(files,path,name);
        if(strcmp(type,"pack")==0)
        {
            zip->Packaging();//упаковка файлов в один
            Нoff.archiving(zip,Wood,Нoff);
        }
        if(strcmp(type,"unpack")==0)
        {               
            Нoff.unСompression(Wood.counting,files,zip);//разархивация
            zip->Unpacking(zip->unhoff_bin_file);
        }
    }
    else std::cout<<"Параметры -pack/-unpack , -files, -path обязательны!"<<std::endl;
    std::cout<<std::endl<<"########################################################"<<std::endl<<std::endl;
    std::cout << "Время выполнения = " << clock()/1000.0 << endl; // время работы программы
    
    system("pause");
    return 0;*/
    
    return a.exec();
}
0
Лучшие ответы (1)
10.05.2016, 14:59
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.05.2016, 14:59
Ответы с готовыми решениями:

Как через qDebug () вывести значение строковой переменной в консоль?
В QtCreator нужно сделать вывод через функцию qDebug(). Однако с этим возникают трудности т.к. нужно вывести переменные типа string. Как...

Скомпилировать, скомпоновать и запустить проект на Qt через консоль Windows
Как правильно скомпилировать,скомпоновать и исполнить(запустить) проект (программу) на Qt через консоль Windows?? Можете привести нужные...

Нужно работать с bmp файлом в консоли. Как задать путь к файлу через консоль?
Мне нужно работать с *.bmp файлом в консоли. как задать путь к файлу через консоль чтобы потом работать с картинкой как с массивом. ...

9
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
10.05.2016, 15:03 2
Конечно можно. Обычным условием: если есть есть аргументы, или специальный аргумент - не запускам GUI, если нет - запускаем.
1
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
10.05.2016, 15:15  [ТС] 3
Пока не поняла про условие. Вместе все не работает-появляется куча ошибок. Можно с примером, какое ставится условие? if(argv>1)- это разве не условие?
А специальный аргумент это имеется в виду, если в начале например ставлю первый аргумент -b то программа работает через командную строку, а если нет, то GUI. Я правильно думаю? Просто разбираюсь с этим впервые.
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
10.05.2016, 15:21 4
Да, все верно.

Ошибки компиляции у вас не от GUI/CLI, а от неверного кода. Исправить сначала его, а затем уже делайте условие.
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
10.05.2016, 15:47  [ТС] 5
Отдельно и то и другое отрабатывает корректно.Я же говорю, что если закомментировать одно, то другое всегда корректно работает.
Вот так с параметром -cli с командной строкой отрабатывает, а через GUI не хочет. Выкидывает исключение.Может не так что-то указала?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "zipper.h"
#include <QtWidgets/QApplication>
#include <ctime>
 
int main(int argv, char *argc[])
{
    Node Wood;
    Hoffman Нoff;
    setlocale(LC_ALL,"Russian");
    
    
    if(strcmp(argc[1],"-cli")==0) {
 
        std::cout<<std::endl<<"######################## ZIPPER ########################"<<std::endl<<std::endl;
        std::cout<<argc[1];
        if(argv>1)
        {//-cli -pack -files C:\test\text1.txt C:\test\text2.txt C:\test\text3.txt -path C:\test -name proba
            //-cli -unpack -files C:\test\proba.bin -path C:\test\unpack
            std::vector<std::string> files;
            std::string path = "";
            std::string name ="";
            bool flag_fs = false, flag_path = false, flag_name= false;
            char type[7];
            memset(type,0,7);
            for(int i=1;i<argv;i++)
            {
                if(strcmp(argc[i],"-pack")==0) { strcpy(type,"pack"); flag_fs=flag_path=flag_name=false;}
                if(strcmp(argc[i],"-unpack")==0) { strcpy(type,"unpack"); flag_fs=flag_path=flag_name=false;}
                if(strcmp(argc[i],"-path")==0) {flag_path=true; flag_fs=false; flag_name= false; continue; }
                if(strcmp(argc[i],"-files")==0) {flag_fs=true; flag_path=false; flag_name= false; continue; }
                if(strcmp(argc[i],"-name")==0) {flag_name= true;flag_fs=false; flag_path=false; continue; }
 
                if(flag_path) {path.assign(argc[i]); }
                if(flag_fs) files.push_back(std::string(argc[i]));
                if(flag_name) {name.assign(argc[i]); }
            }
            Package *zip = new Package(files,path,name);
            if(strcmp(type,"pack")==0)
            {
                zip->Packaging();//упаковка файлов в один
                Нoff.archiving(zip,Wood,Нoff);
            }
            if(strcmp(type,"unpack")==0)
            {               
                Нoff.unСompression(Wood.counting,files,zip);//разархивация
                zip->Unpacking(zip->unhoff_bin_file);
            }
        }
        else std::cout<<"Параметры -pack/-unpack , -files, -path обязательны!"<<std::endl;
        std::cout<<std::endl<<"########################################################"<<std::endl<<std::endl;
        std::cout << "Время выполнения = " << clock()/1000.0 << endl; // время работы программы
 
        system("pause");
        return 0;
    }
    else{
        QApplication a(argv, argc);
        Zipper w;
        w.show();
        return a.exec();
    }
    
}
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
10.05.2016, 16:01 6
Цитата Сообщение от lenarano Посмотреть сообщение
Выкидывает исключение.
Вы его сообщить можете или это тайна? На какой строке оно происходит и тд.
0
2 / 2 / 2
Регистрация: 12.04.2014
Сообщений: 102
10.05.2016, 16:20  [ТС] 7
Необработанное исключение по адресу 0x62B5F950 (msvcr110d.dll) в Zipper.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000.
Ругается в strcmp.asm.
mov eax,[edx]
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
10.05.2016, 16:31 8
Все понятно. Учимся работать с отладчиком.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
10.05.2016, 16:40 9
Лучший ответ Сообщение было отмечено lenarano как решение

Решение

QApplication
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
QCoreApplication* createApplication(int &argc, char *argv[])
{
    for (int i = 1; i < argc; ++i)
        if (!qstrcmp(argv[i], "-no-gui"))
            return new QCoreApplication(argc, argv);
    return new QApplication(argc, argv);
}
 
int main(int argc, char* argv[])
{
    QScopedPointer<QCoreApplication> app(createApplication(argc, argv));
 
    if (qobject_cast<QApplication *>(app.data())) {
       // start GUI version...
    } else {
       // start non-GUI version...
    }
 
    return app->exec();
}
0
Эксперт .NET
 Аватар для Rius
11298 / 7241 / 1606
Регистрация: 25.05.2015
Сообщений: 21,899
Записей в блоге: 14
10.05.2016, 16:47 10
lenarano, в Qt 5.2 добавили свой парсер командной строки.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    setupApplication(&a);
 
#if QT_VERSION_COMBINED >= VERSION_COMBINE(5, 2, 0)
    CommandLine::CmdLine cmd(a.arguments());
    if (cmd.needProcess()) // if console mode
    {
        return cmd.process();
    }
#endif
 
    // gui mode
    MainWindow w;
    w.show();
    return a.exec();
}
Пример
CmdLine в classes/cmdline/cmdline.cpp
1
10.05.2016, 16:47
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2016, 16:47
Помогаю со студенческими работами здесь

Подготовить числа для вывода на консоль через ASCII и вывести на консоль
В регистре eax находится число, которое нужно превратить в ASCII-код и вывести на консоль символы, которые соответствуют полученному. ...

Как подключить БД через графический интерфейс?
Здравствуйте. Пишу курсовой и большой проблемой является подключение БД через графический интерфейс. Как объяснил преподаватель нужен...

Ввести через консоль несколько переменных через пробел в одной строке
Всем привет. Я только учусь программировать, так что вопрос должен быть довольно несложным. Мне нужно ввести через консоль несколько...

Как включить webmin через консоль?
Выключил автозагрузку webmin на VPS CentOS через интерфейс. Как его включить через консоль или файл конфигурации кто знает?

Как передать параметры через консоль?
Win Vista, 32bit, Strawberry PERL 5.12.0 Файл cnu.pl (3 строки): use strict; print @ARGV; &lt;&gt;; При вызове: &quot;perl...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Ключевые слова Python
hw_wired 15.02.2025
Ключевые слова в Python - это специальные зарезервированные слова, которые имеют особое значение и функции в языке. В настоящее время Python включает 35 ключевых слов и 4 мягких ключевых слова. Эти. . .
Отличия изменяемых и неизменяемых типов в Python
hw_wired 15.02.2025
В Python существует принципиальное различие между изменяемыми (mutable) и неизменяемыми (immutable) типами данных, которое оказывает существенное влияние на работу программ. Это различие часто. . .
Python: сравнение списков и кортежей
hw_wired 15.02.2025
В Python последовательности являются одними из самых важных и часто используемых типов данных. Они позволяют хранить упорядоченные наборы элементов, к которым можно обращаться по индексу. Среди всех. . .
Как скачивать файлы с URL с помощью Python
hw_wired 15.02.2025
Для скачивания файлов Python предлагает как встроенные средства, так и сторонние библиотеки. Встроенный модуль urllib из стандартной библиотеки обеспечивает базовую функциональность для работы с URL. . .
Использование SQLAlchemy в Python
hw_wired 15.02.2025
SQLAlchemy - мощная библиотека для работы с базами данных в Python, которая предоставляет полноценный набор средств для объектно-реляционного отображения (ORM) и обширные возможности для работы с. . .
Взаимодействие с REST API в Python
hw_wired 15.02.2025
В современном мире разработки программного обеспечения REST API стал неотъемлемой частью архитектуры веб-приложений. API (Application Programming Interface) - это набор правил и протоколов,. . .
Разделение строк в Python
hw_wired 15.02.2025
Python предлагает богатый набор возможностей для работы со строками, и среди них разделение строк занимает особое место. Этот процесс позволяет разбивать текст на отдельные компоненты, что критично. . .
Объединение строк в Python
hw_wired 15.02.2025
При работе с текстовыми данными в Python нередко возникает необходимость объединять несколько строк в одну. Это может потребоваться при форматировании вывода, обработке текстовых файлов или создании. . .
Лучшие игровые движки на Python
hw_wired 15.02.2025
В последнее время разработка игр стала одним из самых популярных направлений программирования, и Python не остался в стороне от этого тренда. Несмотря на то, что Python обычно не ассоциируется с. . .
Декоратор jit в Python
hw_wired 15.02.2025
Если вы достаточно долго изучаете программы и пакеты на Python для машинного обучения, то наверняка замечали, что паттерн "JIT-декоратор" довольно популярен. Этот подход позволяет превратить обычные. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru