Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Lagovas от Июль 29, 2011, 17:14



Название: QtCreator + Boost
Отправлено: Lagovas от Июль 29, 2011, 17:14
Помогите подключить буст к креатору. Уже несколько дней пытаюсь, не получается, почти отчаялся. В частности не могу regex подключить. Вот как пытаюсь. Собрал регекс так
bjam --with-regex stage

Теперь .pro файл.

Код:
QT       += core

QT       -= gui

TARGET = Test
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

INCLUDEPATH+="D:/EXE/C++/boost_1_46_1"

SOURCES += main.cpp

LIBS += D:/EXE/C++/boost_1_46_1/bin.v2/libs/regex/build/msvc-10.0/release/link-static/threading-multi/libboost_regex-vc100-mt-1_46_1.lib
LIBS += -LD:/EXE/C++/boost_1_46_1/bin.v2/libs/regex/build/msvc-10.0/release/link-static/threading-multi -llibboost_regex-vc100-mt-1_46_1

Пробую подключить либу 2 способами. Теперь исходник. Брал его из доки буста.

Код:
#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
    return 0;
}

И приведу кусок из вывода ошибок, т.к. там много, и все относительно boost::re_detail

debug/main.o: In function `cpp_regex_traits_char_layer':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:366: undefined reference to `boost::re_detail::cpp_regex_traits_char_layer<char>::init()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/regex_raw_buffer.hpp:131: undefined reference to `boost::re_detail::raw_storage::resize(unsigned int)'
debug/main.o: In function `save_state_init':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:107: undefined reference to `boost::re_detail::get_mem_block()'
debug/main.o: In function `~save_state_init':
d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_common.hpp:206: undefined reference to `boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/perl_matcher_non_recursive.hpp:1117: undefined reference to `boost::re_detail::put_mem_block(void*)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pattern_except.hpp:75: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/basic_regex_parser.hpp:218: undefined reference to `boost::regex_error::regex_error(std::string const&, boost::regex_constants::error_type, int)'


И конец вывода:

debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pending/object_cache.hpp:75: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/pending/object_cache.hpp:75: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:625: undefined reference to `boost::re_detail::lookup_default_collate_name(std::string const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:667: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:682: undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1051: undefined reference to `boost::scoped_static_mutex_lock::scoped_static_mutex_lock(boost::static_mutex&, bool)'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1054: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
debug/main.o:d:/EXE/C++/boost_1_46_1/boost/regex/v4/cpp_regex_traits.hpp:1054: undefined reference to `boost::scoped_static_mutex_lock::~scoped_static_mutex_lock()'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Test.exe] Error 1
mingw32-make: *** [debug] Error 2
Процесс «D:\QtSDK\mingw\bin\mingw32-make.exe» завершился с кодом 2.
Возникла ошибка при сборке проекта Test (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»


В общем помогите плз. Заранее благодарен.

П.С. Кстати, вопрос на засыпку. Что есть в бусте, чего нет в Qt? Все это задумывалось из за регулярок, но вот увидел, что есть регулярки в Qt. Так интересно, что лучше и все ли покрывает Qt, что есть в бусте?

П.С. Всем спасибо за быстрое реагирование, решил. Надо было подключать boost\stage\lib.
Вопрос на засыпку. Я собрал проект, но в Release папке не было длл. Можно ли как то сделать, что бы при сборке, креатор кидал туда все либы которые нужны для проги?
И все же хотелось бы так же узнать ответ по поводу boost и qt и как еще можно подключать dll из креатора не написанием LIB, а с помощью GUI? Я когда правой кнопкой в редакторе файла .pro нажимаю и выбираю добавить либы, без разницы, выбираю статическую или динамическую, при выборе файла стоит фильтр на .lib. И длл попросту выбрать не могу. Ничего кроме .lib, а ведь mingw вроде их компилит в другом расширении, в .a кажется. Есть решение? Это баг креатора?


Название: Re: QtCreator + Boost
Отправлено: alex312 от Июль 29, 2011, 19:24
Рабочий проект(смотреть вложения).
Компилятор : msvc-2008

P.S. В Qt тоже есть регулярки (http://doc.qt.nokia.com/4.7/tools-regexp.html)


Название: Re: QtCreator + Boost
Отправлено: alex312 от Июль 30, 2011, 10:16
Что лучше boost или Qt - спорить и что-то утверждать неправильно в принципе.
С boost не сильно знаком, поэтому скажу чего там нет, это:
 - средств(классов) для построения GUI;
 - классов работы с базами данных;
 - Web движка;
 - встраиваемого скриптового языка;
 - не решена работа со строками и unicode;

Но и в boost есть чем похвастатся :
 - библиотека работы с графами
 - библиотеки нестандартных контейнеров
 - различные математические библиотеки

Так что есть из чего выбирать  ::)


Название: Re: QtCreator + Boost
Отправлено: Fess от Июль 30, 2011, 17:21
П.С. Кстати, вопрос на засыпку. Что есть в бусте, чего нет в Qt? Все это задумывалось из за регулярок, но вот увидел, что есть регулярки в Qt. Так интересно, что лучше и все ли покрывает Qt, что есть в бусте?
В Qt есть _все_, что нужно для построения среднестатистического приложения. Из того, что есть в бусте, но нет в Qt нет ничего сверх необходимого, а аналоги можно найти и не только в бусте. Не используйте буст в Qt проекте пока он вам _действительно_ не понадобится.
Вопрос на засыпку. Я собрал проект, но в Release папке не было длл.
Буст использует статические библиотеки, которые линкуются прямо в ваш исполняемый файл. Это же является его большим минусом (с моей точки зрения). Ваш проект начинает на порядок медленнее компилироваться и линковаться. Плюс, буст напичкан шаблонами, которые скорости сборки, мягко говоря, не добавляют.
Можно ли как то сделать, что бы при сборке, креатор кидал туда все либы которые нужны для проги?
Креатор может кидать то, что сам собирает в папку DESTDIR. Насколько я знаю, с зависимостями так не выйдет.
И все же хотелось бы так же узнать ответ по поводу boost и qt и как еще можно подключать dll из креатора не написанием LIB, а с помощью GUI? Я когда правой кнопкой в редакторе файла .pro нажимаю и выбираю добавить либы, без разницы, выбираю статическую или динамическую, при выборе файла стоит фильтр на .lib. И длл попросту выбрать не могу. Ничего кроме .lib, а ведь mingw вроде их компилит в другом расширении, в .a кажется. Есть решение? Это баг креатора?
Указать библиотеку в LIBS единственно-правильный способ. Любой GUI мастер сделает то же самое. Напрямую редактировать файлы проекта гораздо лучше, чем пользоваться GUI. Вы будете лучше понимать что происходит на самом деле, получите необходимую гибкость в настройке и не будете зависеть от какой-либо IDE.

ЗЫ: библиотеки буста обычто лежат в boost_1_46_1/stage/lib build вам не нужен, можете его просто удалить.


Название: Re: QtCreator + Boost
Отправлено: Igors от Июль 30, 2011, 17:30
Из того, что есть в бусте, но нет в Qt нет ничего сверх необходимого, а аналоги можно найти и не только в бусте.
Прошу показать аналог http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm (http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm)


Название: Re: QtCreator + Boost
Отправлено: Fess от Июль 30, 2011, 19:09
Прошу показать аналог http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm (http://www.boost.org/doc/libs/1_47_0/libs/polygon/doc/index.htm)
Согласитесь, это не предмет первой необходимости. Охотно вам верю (хотя не проверял), что нигде более нет аналогов этой библиотеки, но это лишь значит, что она достаточно узконаправленная и нужна не всем и не всегда.


Название: Re: QtCreator + Boost
Отправлено: Igors от Июль 31, 2011, 01:04
Согласитесь, это не предмет первой необходимости.
"Необходимость" и "частота использования" - разные вещи :) Возможно задача потребуется всего 1 раз (и никогда больше) - но необходимость в ее решении может быть огромной. А вообще согласен с Вами что просто так поиграться с бустом - особого смысла не видно.


Название: Re: QtCreator + Boost
Отправлено: dimen от Июль 31, 2011, 04:56
надо добавить system, thread, pthread либы чтобы слинковалось...
при использовании qt буст нафиг не впился!


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 01:34
Пишу приложение для копирования файлов или разархивация и переименовывание. Нужно было использовать регулярные выражения. Попробовал QRegExp, не сработал. Я попробовал на питоне, работает. Подключил буст, работает. Пример ниже скину. Нужно было скопировать файл, чуток не разобрался как. Есть QFile::copy(QString& filename). И тут вопрос, filename это название файла или полный его путь? Пробовал полный путь, чет не проканало, а в доке не нашел примера. Кто может показать пример как копировать в кьюте и перемещать тоже не помешало бы.
По поводу QRegExp. Мне надо было вытащить USERPROFILE из environ. Я сначало сделал QString str = QProcess::systemEnvironment().join(",") и нахожу регуляркой что мне надо, что бы не пробегать foreach (нравятся регулярки, хотя хз че быстрее будет).
Юзаю бустом такую регулярку = boost::regex xRegEx("USERPROFILE=(.+?),"); Такая же с помощью QRegExp не канала. Вроде вообще ничего не находила.
Кстати, по поводу копирования, это не упрек, а просьба помощи, т.к. с помощью boost::filesystem3 тоже не получается. Я пока учусь, так что заранее благодарен за помощь.

П.С. почему либы буста нельзя линковать динамически? ведь когда она компилит либы, то делает статику и динамику. У меня на каждую либу есть .a и .dll файл, при чем дебаг версии, релиз, мультитред и еще какая то мб. Какую лучше подключать и как указать в Qt какую конкретно, ведь либа указывается без разрешения (вроде). Конкретно писать LIBS += /path/somelib.dll ?

П.С. Еще вопросик, есть ли какой то способ проверить, закончен ли файл или нет? Например файл скачивается торрентом или менеджером закачек, который выделяет полностью память и нет в нем функции добавить суфикс к незакаченному файлу, как можно проверить завершенность?


Название: Re: QtCreator + Boost
Отправлено: Авварон от Август 01, 2011, 02:33
цопи без разницы какой путь, укажете имя - будет файл с этим именем в текущей директории (скорее всего рядом с бинарником), полный путь - создастся файл по этому пути. Бтв кьюфал::цопи юзать не совсем правильно (в вашем случае), тк вы не будете в курсе прогресса копирования.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 02:54
посоветуй как правильней? файлы небольшие, около 17 .png. Но все же интересно как правильней?
Если указывать путь в папку, он не копирует в папку, только если задавать путь с именем файла, только что проверял. Например f.copy("d:\\test_qt") не сработает, так же и f.copy("d:\\test_qt\\"). А вот f.copy("d:\\test_qt\test.lol")
Почему то даже f.copy("d:\\test_qt\\"+f.fileName()) не работает. Кто расчехлит?

П.С. Попробовал еще раз бустом, он выдает ошибку: Нет доступа. Я посмотрел, доступ пользователям, доверенным приложениям и тем более мне есть на чтение, запись. Добавил даже группу "Все", все равно. Кто знает в чем может трабла? При чем напостой такое в работе с файлами. Win7 professional


Название: Re: QtCreator + Boost
Отправлено: Igors от Август 01, 2011, 05:04
Почему то даже f.copy("d:\\test_qt\\"+f.fileName()) не работает.
Не связывайтесь с QFile::fileName. Действуйте через QFileInfo, этот (очень полезный) класс всегда вернет полный правильный путь. А конструкторы для QFileInfo см. в Assistant



Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 05:31
Код:
QFileInfo f("d:\\vstup.py");
QFile::copy(f.absoluteFilePath(),QDir("d:\\test_qt").absolutePath()) ? std::cout<<"ok" : std::cout<<"bad";

Вот так использовать? Всеравно не копирует. Наверное доступа нету.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 08:14
По поводу QRegExp. Мне надо было вытащить USERPROFILE из environ. Я сначало сделал QString str = QProcess::systemEnvironment().join(",") и нахожу регуляркой что мне надо, что бы не пробегать foreach (нравятся регулярки, хотя хз че быстрее будет).
Юзаю бустом такую регулярку = boost::regex xRegEx("USERPROFILE=(.+?),"); Такая же с помощью QRegExp не канала. Вроде вообще ничего не находила.
Код
C++ (Qt)
QRegExp re("USERPROFILE=(.+),");
re.setMinimal(true);
QString userprofile;
if (rx.indexIn(QProcess::systemEnvironment().join(",")) > -1)
   userprofile = rx.cap(1);
а вообще, как говорится :)
Цитировать
Если у программиста есть проблема и он думает — «Я решу ее при помощи регулярных выражений», то с этого момента у программиста уже две проблемы.

Код:
QFileInfo f("d:\\vstup.py");
QFile::copy(f.absoluteFilePath(),QDir("d:\\test_qt").absolutePath()) ? std::cout<<"ok" : std::cout<<"bad";

Вот так использовать? Всеравно не копирует. Наверное доступа нету.
надо указывать полный путь к файлу в обоих параметрах:
Код
C++ (Qt)
QFileInfo f("d:/vstup.py");
QFile::copy(f.absoluteFilePath(), QString("d:/test_qt/%1").arg(f.fileName())) ? std::cout<<"ok" : std::cout<<"bad";
и да, в Qt можно всегда пользоваться прямыми слешами независимо от платформы. если же надо вывести путь в "родном" виде, то используй функцию QDir::toNativeSeparators(). ну и конечно папка d:/test_qt должна существовать.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 15:38
т.е. указать просто папку нельзя?
Кстати, вопрос такой. Как QRegExp::cap() узнает какую стрингу ему надо парсить, или предварительно обязал надо юзать QRegExp::indexIn()? Нет ли какой то setText или перегруженный cap с аргументом стринга?


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 16:15
т.е. указать просто папку нельзя?
нет. неужели так сложно к папке приплюсовать слеш и имя файла? :)
Кстати, вопрос такой. Как QRegExp::cap() узнает какую стрингу ему надо парсить, или предварительно обязал надо юзать QRegExp::indexIn()? Нет ли какой то setText или перегруженный cap с аргументом стринга?
QRegExp::cap() только возвращает захваченную подстроку (с параметром 0 - полное совпадение), а непосредственно поиск выполняется в QRegExp::indexIn() (или QRegExp::lastIndexIn() или QRegExp::exactMatch()).

и тут тоже пытаешься сэкономить на строчке? :)


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 17:10
Нет, просто для меня это было не явно. Я привык в других языках поиск типа search, findall и т.п. Где ты сам конкретно указываешь паттерн, строку источник. Потом тип match групируешь в строку в переменную какую надо. А тут indexIn, сразу на ум приходить что он просто находит номер позиции первого совпадения. Ясно, спасибо. Сейчас буду пробовать.
Кстати, ты пробовал USERPROFILE найти своим регекспом? находило? сейчас попробую.
И еще, как на счет прав доступа? сталкивался? Уже надоела эта трабла. Вроде права есть, а оно не может записать, считать или подобное. Хотя в Qt пробовал записать, потом считать QFile::error(), он отдавал 0.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 17:50
1. для того, чтоб не "на ум приходило", надо читать документацию
2. регэксп не запускал, но должен работать
3. может ты там тоже только папку указывал без имени файла? нерабочий код в студию.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 18:21
Код:
void NarutoMove::on_submitButton_clicked()
{
    logTextEdit->append("Copying start");
    QString name;
    QString numChapter;
    if(!dirFrom.isEmpty())
    {
        QDir d(dirFrom);
        logTextEdit->append(dirFrom);
        numChapter=getChapterNumber(d.dirName());
        logTextEdit->append(numChapter);
        QStringList sl = d.entryList(QDir::Files);
        logTextEdit->append("d.entryList");
        foreach(name,sl)
        {
            logTextEdit->append("Start foreach");
            if (!name.startsWith("Credit"))//что бы копировать только главы
            {
                name="\\"+name;
                QFile f(dirFrom+name);
                f.copy(dirTo+name);
                logTextEdit->append(f.errorString());
                logTextEdit->append(QString("copied %1 to %2").arg(dirFrom+name,dirTo+name));
            }
        }
    }
}
dirFrom и dirTo получаю с помощью QFileDialog::getExistingDirectory
Пишет Unknown error.


Название: Re: QtCreator + Boost
Отправлено: Igors от Август 01, 2011, 19:02
Попробуйте так
Код
C++ (Qt)
...          
if (name.startsWith("Credit")) continue;
QFileInfo infoFrom(dirFrom, name);
QFileInfo infoTo(dirTo, name);
QFile::copy(infoFrom.absoluteFilePath(), infoTo.absoluteFilePath());
...
}
 


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 19:06
обычно временную переменную объявляют прямо в foreach:
Код
C++ (Qt)
foreach(QString name,sl)
может быть проблема в обратном слеше (я говорил пару постов назад, что в Qt можно везде использовать прямой слеш)

QFile::copy() (обе ее версии) возвращает bool - по этому можно определить успешной ли была операция, тогда и считывать errorString()


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 19:28
Код:
foreach(name,sl)
        {
            logTextEdit->append("Start foreach");
            if (!name.startsWith("Credit"))//что бы копировать только главы
            {
                //name="/"+name;
//                QFile f(dirFrom+name);
//                f.copy(dirTo+name)? logTextEdit->append(QString("copied %1 to %2").arg(dirFrom+name,dirTo+name)):
//                                    logTextEdit->append(f.errorString());

                QFileInfo infoFrom(dirFrom, name);
                QFileInfo infoTo(dirTo, name);
                QFile::copy(infoFrom.absoluteFilePath(), infoTo.absoluteFilePath())? logTextEdit->append(QString("copied %1 to %2").arg(dirFrom+name,dirTo+name)):
                    logTextEdit->append("error");;
            }
Всеравно ошибка, по разному пробовал. Вот скрин доступа к папке.
(http://h1813090.stratoserver.net/getpreview.aspx?guid=e51c2752-522a-490e-a692-68ab746cd903&type=1) (http://floomby.ru/content/brxwkkHiZU/)


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 19:56
что ли скинь проект и файлы - проверим


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 20:00
http://floomby.ru/content/fwlyjjf602/

Кстати по поводу QString name, я его не обьявляю в foreach, ибо функция не дописана, и он еще будет юзатся в случае !dirFrom. Потому отдельно обьявил. Кстати, там еще жалуется на сигнал, заодно по нему подскажите плз))

П.С. А можно ли как то узнавать чей textChanged вызвался? Просто мне надо знать как поступить, в зависимости от текста двух LineEdit. И было бы меньше проверок, если бы я знал чей textChanged сделал сигнал? Просто интересно. Только учу куте, и возможно такое существует.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 20:29
эх, буст у меня не установлен :) но я убрал его и заменил на QRegExp.

если пишешь в исходниках русские буквы (будь то комментарии или строки для программы), то уж сохраняй файл в UTF-8 хотя бы.

под "файлами" я имел в виду тестовые файлы (книга или что там у тебя).

я даже собрать не могу без ошибок. такое впечатление, будто ты забыл приложить файл формы, который лежит у тебя не в папке приложения, а возле нее (судя по записи в .pro файле и отсутствии нужных переменных в имеющемся .ui файле).
Цитировать
П.С. А можно ли как то узнавать чей textChanged вызвался? Просто мне надо знать как поступить, в зависимости от текста двух LineEdit. И было бы меньше проверок, если бы я знал чей textChanged сделал сигнал? Просто интересно. Только учу куте, и возможно такое существует.
метод sender().
Код
C++ (Qt)
QLineEdit *lineEdit = qobject_cast<QLineEdit *>(sender());
if (lineEdit)
{
   // сравниваешь lineEdit с имеющимися
}
 


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 20:35
Прошу прощения, реально не тот уи файл. http://floomby.ru/content/c3R1hksTkq/ - вот. Прост гуи делал в дизайнере, а сохраняю, а потом проект уже делал. Потом в разных папках было. По поводу УТФ, сейчас же сделаю. Еще не настроил Креатор.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 21:36
про ошибки при копировании - у тебя слот on_submitButton_clicked() вызывается 2 раза подряд при нажатии на кнопку, потому что один раз он был автоматически присоединен, а второй - ты явно соединяешь в конструкторе. так вот в логе видно, что один раз все замечательно копируется, а второй - сыпятся ошибки, потому что на месте назначения уже присутствуют файлы, а QFile::copy() копирует только если файла с таким же именем не существует. закомментируй connect(submitButton,SIGNAL(clicked()),this,SLOT(on_submitButton_clicked())); и все будет нормально.

про ошибку сигнала - поскольку твой слот начинается с "on_", то QObject пытается автоматически соединить сигнал с этим слотом (on_<sendername>_<signalname>()), но не находит нужного сигнала.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 21:51
Всем огромнейшее спасибо за принятие участия в помощи моей траблы, понял в чем фигня, когда начал выводить пути. Я обычно путь вручную указывал, но не сделал сигнал textChanged, что бы присваивало dirTo значение. Плюс указанная по умолчанию папка обычно не существует, а потому ее надо создавать. Отсюда и эррор.

И все же интересно, можно ли стандартными средствами узнать какой обьект послал сигнал? Например обьект сигнала textChanged? Что бы точнее вносить изменения. Например в C# делегаты обычно типа (Object sender, EventArgs arg), и всегда можно работать с обьектом, на который подписан метод. А так всем спс)

Закоментировал, но варн на слот есть "QMetaObject::connectSlotsByName: No matching signal for on_dirToFromChanged(QString)"

П.С. kambala - вопрос к тебе личный, ты просматривал мой код, как тебе в общем? На что обратить внимание? Как оформление? Какие советы? Заранее благодарен.


П.С. еще вопросик, как можно вызывать другие исполнительные файлы или юзать консоль системы(или как там называется это)? Нужно например разархивировать. Думаю юзать rar.exe, консольный архиватор от Winrar. В питоне юзал типа os.system("console commands"). Наверное можно создавать новый процесс и т.п., но не хочется с этим связываться, хочется юзнуть простой метод какой то.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 22:46
И все же интересно, можно ли стандартными средствами узнать какой обьект послал сигнал? Например обьект сигнала textChanged? Что бы точнее вносить изменения. Например в C# делегаты обычно типа (Object sender, EventArgs arg), и всегда можно работать с обьектом, на который подписан метод. А так всем спс)
посмотри на мой предыдущий пост
Закоментировал, но варн на слот есть "QMetaObject::connectSlotsByName: No matching signal for on_dirToFromChanged(QString)"
переименуй слот (убери у него "on_")
П.С. kambala - вопрос к тебе личный, ты просматривал мой код, как тебе в общем? На что обратить внимание? Как оформление? Какие советы? Заранее благодарен.
не экономить на пробелах и не писать кириллицу в исходниках
П.С. еще вопросик, как можно вызывать другие исполнительные файлы или юзать консоль системы(или как там называется это)? Нужно например разархивировать. Думаю юзать rar.exe, консольный архиватор от Winrar. В питоне юзал типа os.system("console commands"). Наверное можно создавать новый процесс и т.п., но не хочется с этим связываться, хочется юзнуть простой метод какой то.
http://www.prog.org.ru/index.php?topic=18532.msg124702#msg124702


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 01, 2011, 22:53
Еще раз спасибо. На пробелах... Разве економил?
По поводу кирилици, а если умеешь понимать общий смысл текста на англ, но неуверенно и грамматически неправильно пишешь на англ, как тогда? На инглише не проканает.


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 01, 2011, 23:58
Еще раз спасибо. На пробелах... Разве економил?
вот при написании сообщений после запятых пробелы ставишь, а в коде - нет
По поводу кирилици, а если умеешь понимать общий смысл текста на англ, но неуверенно и грамматически неправильно пишешь на англ, как тогда? На инглише не проканает.
тогда да, лучше на русском. но не забывать о UTF-8.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 03, 2011, 00:34
И еще вопрос, что б не городить левую тему. Что б прога работала, надо подключать QtCored4 и QtGuid. А нельзя ли как то без них или что бы в ехе вшивались как то? А то реально, прога маленькая, для копирования, а дллки весят ~ 180 мб. Даже стыдно скидывать свою прогу кому то с таким размером. В С# только ехе хватало. Конечно, нужен .NET Framework, но если писать на 4.0 то там 55 метров, но не 180 ведь) Плюс ко всеми, ведь делают как то проги с окошками по пару метров. В общем никак 180 сократить нельзя?


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 03, 2011, 01:31
какие 180 метров? тебе нужны только QtGui4.dll и QtCore4.dll скорее всего (если никаких дополнительных модулей не подключал) - в сумме метров 10, а при архивировании раза в 3 меньше. буква d в названии дллки означает, что она предназначена для дебаг-версии, а распространяют-то обычно релиз-версию. чтоб построить релиз-версию, надо выбрать соответствующую опцию в креаторе (слева на панеле где компьютер нарисован).

если хочешь, чтоб дллки вшивались в программу, то надо делать static сборку Qt из исходников (на форуме совсем недавно несколько раз обсуждалось, используй поиск).


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 03, 2011, 02:06
у меня при запуске ехе требует QtGuid4, который 150 мб весит.
П.С. Все, кинул туда обычны QtGui4 и QtCore4 и ок. Извините за наезд, Qt рулит.
П.С. из под Вин под Лин можно компилить? Типа какого нить ключа g++ -o hello hello.cpp -spec linux или подобного?


Название: Re: QtCreator + Boost
Отправлено: kambala от Август 03, 2011, 08:04
из под Вин под Лин можно компилить?
нет. а вот наоборот - можно.


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 03, 2011, 13:11
Я выполняю команду в консоли QProcess::execute("program",args);
Можно ли как то выловить вывод этой командый? В моем случае распаковка архивов, и мне нужен вывод, что бы в окно выводить какие файлы распакованы. Можно конечно сканировать папку куда распаковывается, и выводить файлы папки, но интереснее вывод словить. Заранее благодарен.


Название: Re: QtCreator + Boost
Отправлено: b-s-a от Август 03, 2011, 14:16
Ты документацию на QProcess посмотри. Там все написано. Разве что тебе придется отказаться от execute() в пользу start().


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 03, 2011, 15:07
Если мне надо несколько команд выполнить, надо несколько раз start() делать? Он создает каждый раз новый процесс или просто выполняет команду? Если каждый раз новый процесс, то как тогда можно в том же процессе еще команды повыполнять?
Попробовал пару раз start намутить, фиг. Попробовал write() еще команды написать, фиг. Я так понял надо ждать пока этот закончит работу, потом опять Start, опять создается процесс и выполняется? 2 раза создавать процесс на 2 команды? Иначе никак?

П.С. Потестил, если не создавать обьекта QProcess, а обьявлять QProcess obj, то процесс не создается, а просто выполняются команды. Только хз как в этом случае идет работа с памятью. Этот obj помещается в стек функции, как я понимаю. И уничтожается, как только функция заканчивается. Только и процесс никакой не создается, но выполняет. Как же так? И правильно ли я понял работу памяти в данном случае?

П.С. Решил юзать старт 2 раза. Но загвоздка вышла. Не хочет команду выполнять, хотя тестирую в консоли, все ок. В общем вот код.
Код:
void NarutoMove::extracting(QString archiveFrom,QString dirTo)
{
    QProcess rar;
    rar.start("Rar.exe",QStringList()<<"vb"<<archiveFrom); //содержимое архива

    if (!rar.waitForStarted())
             logTextEdit->append("not waitForStarted");

    if (!rar.waitForFinished())
        logTextEdit->append("not waitForFinished");

    QRegExp reg(".+\\d+\\.\\w{3}");//blablabla\01.jpg
    QStringList filesToExtract;
    QString str;
    filesToExtract<<"e"<<"-o+ -idcdp"<<archiveFrom;//e - extract, -o+ - перезапись, -idcpd - убираем лишний вывод
    while(rar.canReadLine())//добавляем файлы для извлечения
    {
        str=rar.readLine();
        if(reg.indexIn(str)!=-1)
            filesToExtract.append("-n"+str);//-n для добавления файла на выполнение. нужно больше 1 файла

    }
    filesToExtract<<dirTo;
    logTextEdit->append(filesToExtract.join(" "));
    rar.start("Rar.exe",filesToExtract);
    if (!rar.waitForStarted())
             logTextEdit->append("not waitForStarted");

    if (!rar.waitForFinished())
        logTextEdit->append("not waitForFinished");

    QString result = QString(rar.readAll());

    logTextEdit->append(result);
}
Первую команду выполняет, а вторую по разархивированию не хочет, пишет нечего извлекать. Пробую в консоли, хавает. Для работы нужен rar.exe из winrar, если что.


Название: Re: QtCreator + Boost
Отправлено: b-s-a от Август 03, 2011, 17:36
Какой-то у тебя поток слов слабо связанных друг с другом. Причем тут память вообще?

Когда ты создаешь объект класса QProcess, то естественно никакие процессы не запускаются. А вот когда ты делаешь start, то тогда и происходит запуск. Выполнение идет в фоновом режиме, таким образом ты можешь читать/писать из/в stdout+stderr/stdin программы. Если же тебе необходимо выполнить еще одну команду, то никто не запрещает вызвать еще раз start. Но перед этим стоит убедиться, что предыдущий процесс завершился (дождаться его завершения или убить принудительно - есть такие методы).
Если твоя программа покидает область видимости объекта QProcess, то происходит его уничтожение. Последствия этого описаны в документации (запущенная через QProcess программа убивается).
А на счет памяти не беспокойся. Невозможно в современных ОС запустить программу внутри своей (иначе вирусы цвели и пахли).


Название: Re: QtCreator + Boost
Отправлено: Lagovas от Август 03, 2011, 17:43
Я уже разобрался более менее, посмотри плз пост выше, нужна помощь в том коде по аргументам. Не хавает чего то.