Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Alexu007 от Декабрь 04, 2013, 07:58



Название: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 04, 2013, 07:58
Я дико извиняюсь, но - как? Забыл напрочь. Не могу найти в Qt кнопку типо "add to projeсt"... Спасибо.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 04, 2013, 08:08
Правой кнопкой на шапку проекта, потом:
Добавить новый -> Шаблон: с++ -> Файл исходных текстов с++  ;)

Креатор версии 2.7.0


Название: Re: Как добавить файл .cpp в проект?
Отправлено: kambala от Декабрь 04, 2013, 11:50
или можно руками отредактировать .pro, дописав относительный путь к файлу в SOURCES


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 05, 2013, 16:22
Спасибо большое, первый способ подошёл. А ещё вопросик, чтобы форум не засорять... Нужно тут старые коды на Си использовать - ругается на "memsem" и "memcpy". В Qt работа с памятью осуществляется по другому?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 05, 2013, 16:50
В Qt память осуществляется также как в с++, т.к. Qt - набор библиотек и расширение языка :)

Цитировать
ругается на "memsem" и "memcpy"
Компилятор знает много ругательств ;D А какая ошибка? :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 05, 2013, 18:03
C:\QtSDK\Alexu007\LameQt\lamaQt\_encode2.cpp:641: ошибка: 'memcpy' was not declared in this scope


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Igors от Декабрь 05, 2013, 18:24
Нужно тут старые коды на Си использовать - ругается на "memsem" и "memcpy". В Qt работа с памятью осуществляется по другому?
Прочитав такой квешн - жить не хочется   :'(
Инклюдов не хватает, добавьте #include <string.h>


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 05, 2013, 19:34
Прочитав такой квешн - жить не хочется   :'(
Инклюдов не хватает, добавьте #include <string.h>
[/quote]
У меня в другом проекте мемсет работает без #include <string.h>, специально ещё раз проверил - нет его там нигде. Поэтому и вопрос нарисовался. Понятно что незадекларирован и библиотеки не хватает (почему string?), непонятно почему "там работает тут неработает".


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Old от Декабрь 05, 2013, 19:41
У меня в другом проекте мемсет работает без #include <string.h>, специально ещё раз проверил - нет его там нигде. Поэтому и вопрос нарисовался. Понятно что незадекларирован и библиотеки не хватает (почему string?), непонятно почему "там работает тут неработает".
Скорее всего <cstring> инклюдится из другого файла, который вы используете.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alex Custov от Декабрь 05, 2013, 19:58
У меня в другом проекте мемсет работает без #include <string.h>, специально ещё раз проверил - нет его там нигде. Поэтому и вопрос нарисовался. Понятно что незадекларирован и библиотеки не хватает (почему string?), непонятно почему "там работает тут неработает".

http://www.cplusplus.com/reference/cstring/memcpy/

</thread>


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 05, 2013, 21:03
Хз. В явном виде я <string.h> в том проекте не нашёл. Там правда <QMessageBox> имеется.

Ещё вопросик, если не надоел ещё. Я проект тут один из билдера 6 в Qt перекидываю. Проект большой, 10 файлов .cpp (и .h соответственно). В билдере всё работает. В Qt после переноса файлов много на что заругался (на мемсет в т.ч.), но вроде я всё разрулил и проект откомпилировался. Но. На ровном месте проблема нарисовалась. Во всех файлах кроме widget.cpp не видит Qt-шных типов, в частности QString - пишет что незадекларирован. Почему? Я файлы в проект официально добавил, как мне выше подсказали, а не просто скопировал в папку.

Чё ему ещё не хватает?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 05, 2013, 22:13
Сам разобрался.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 07, 2013, 14:40
В добавленном в проект файле не хочет видеть ui->label. Что там добавить надо?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Bepec от Декабрь 07, 2013, 14:56
Ы. Как минимум в классе с формой перенести ui в public, потом подключить хедеры к новому cpp, далее уже творить хрень. Ибо то, что вы делаете на это смахивает :D

PS лучше уж скажите какая у вас задача в целом и тогда подробно объясню почему так делать не надо :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 07, 2013, 15:12
Да вот поект lama в Qt переношу. Там много вычислений и они по разным файлам расбросаны, а в файле widget.cpp только оболочка, которая вызывает собственно функцию кодирования. Вывод в label процесса кодирования (чтобы было видно что прога работает - там количество обработанных фреймов увеличивается и время идёт) удобнее делать из другого файла, там где сам кодек находится.

Да и вообще, в чём проблема то? Какая разница в каком файле стоит обращение к label? Это уже даже не программирование, а вопросы оформления программы, удобочитаемости кода. То есть если я ссыплю всё в один огромный файл - это нормально?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Bepec от Декабрь 07, 2013, 15:20
Нет, неправильно. Это напрямую относится к программированию и называется архитектурой программы.

Но вы учтите, что позже вам понадобится изменить цвет лейбла, потом размер, потом окно прятать/показывать. И вот тогда среди десяти пятнадцати файлов найти эту хрень сможете только вы. А если пару месяцев пройдёт, то и вы не найдете сразу :)

Это так называемая инкапсуляция. Снаружи должен торчать только интерфейс аля setText.
А дальнейшие действия происходят в самом классе. И разобраться будет очень легко, ведь будет одна функция одного класса :)

http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) почитайте на досуге.

PS это не удобочитаемость кода (хотя частично она), это для увеличения скорости отладки и снижения сложности программы. Ведь гораздо приятнее разбираться в
Код:
myWindow->setText("tratata")
чем в
Код:
globalPoint->ui->label_sostoyanieHreny->setText("tratata");

PPS и поведение всей программы вы сможете изменить исправлением одной функции :) В общем полезная и умная вещь.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: kambala от Декабрь 07, 2013, 18:37
для подобных ситуаций как раз и были придуманы сигналы/слоты. кодек отправляет какое-то значение прогресса, а класс формы уже отображает это значение.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 12:30
Кодек написан на си 20 лет назад - какой сигнал он может отправить? Хотя это мысль. Есть два варианта: 1.Тупо перетащить функцию в другой файл, и всё заработает. 2.Мутить с сигналами.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: kambala от Декабрь 08, 2013, 13:04
сделай С++-обертку над ним


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 13:24
Над этим и работаю.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Igors от Декабрь 08, 2013, 15:15
Проект большой, 10 файлов .cpp (и .h соответственно).
Ну очень большой  :)

Ведь гораздо приятнее разбираться в
Код:
myWindow->setText("tratata")
чем в
Код:
globalPoint->ui->label_sostoyanieHreny->setText("tratata");
Наоборот, во втором случае ясно что делается, видно что label и какой. А что делает myWindow->setText? Изменяет title окна? Ничего др в голову не приходит.  

Это так называемая инкапсуляция. Снаружи должен торчать только интерфейс аля setText.
А дальнейшие действия происходят в самом классе. И разобраться будет очень легко, ведь будет одна функция одного класса :)
UI имеет точно не один элемент, поэтому если начать оборачивать обращения к ним - десятка 2 набежит даже для скромного UI. Ладно, автор не обязан следовать собственным рекомендациям - они даются для других  :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Bepec от Декабрь 08, 2013, 15:20
Только одну реплику я разрешу себе в адрес Igors.

Если вам так нравится читать код хзчто из хзчего и у хзчего на нём размещенного вызвать функцию setText, тогда пишите так и не жалуйтесь на стили других :)

PS просто вы, Igors чрезвычайно любите цепляться к тексту примера. :) 


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Igors от Декабрь 08, 2013, 16:17
PS просто вы, Igors чрезвычайно любите цепляться к тексту примера. :) 
Так пример тот "по книжке", а не "по жизни", поэтому эффект получился обратный. Тогда уж для обертки setHrenText  :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 17:08
Че то не получается послать сигнал из другого файла. Пишет что: 'mySignal' was not declared in this scope.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 08, 2013, 17:34
Код в студию :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 20:03
Спасиб, заработало. Функцию, которая эмитирует сигнал, сделал членом класса виджет - mySignal увидела. А вот label-ы всё равно видеть не хочет, ну да хрен с ними. И так сойдёт.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 20:47
С временем поможете разобраться? Хочу счётчик времени кодирования прикрутить. Для этого:

Код
C++ (Qt)
   QTime time;
 
   time.setHMS (0, 0, 0, 0);
   time.start();
 
   //а в функции, которая вызывается через определённые промежутки времени
   //(через каждые 100 фреймов)
 
   QString str = time.toString("hh:mm:ss");
 
   ui->label4->setText(str);

Часики не тикают, а выдают однократно компьютерное время. Если убрать time.start() выдают нули. Я вообще ждал, что time стартует с нуля и каждый раз будет показывать меняющееся время.




Название: Re: Как добавить файл .cpp в проект?
Отправлено: Bepec от Декабрь 08, 2013, 20:57
Вы каждый раз создаёте новое время и показываете его. Точнее вероятно вы вызываете данную функцию один раз :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 21:12
Не, не. Установка времени в нули и time.start() выполняется перед началом кодирования - то есть один раз при нажатии кнопки.
QString str = time.toString("hh:mm:ss") вызывается многократно. Вот полный текст места, откуда оно вызывается, в label3 цифры переключаются как положено:


Код
C++ (Qt)
//вызывается через каждые 100 закодированных фреймов
void Widget::MyEventHandler3()
{
   QString str = time.toString("hh:mm:ss");
 
   ui->label3->setText(QString::number(gfp->frameNum));
 
   ui->label4->setText(str);
 
   QApplication::processEvents();
}



 


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 08, 2013, 21:12
Замер времени выполнения кода делается так:

http://doc.crossplatform.ru/qt/4.7.x/qtime.html#start

Код
C++ (Qt)
QTime t;
t.start();
some_lengthy_task();
qDebug("Time elapsed: %d ms", t.elapsed());
 


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 21:50
Эту штуку я видел, но мне не нужно время работы функции в милисекундах. Мне нужно, чтобы на форме нарисовалось 00:00:00 и во время работы программы время росло. В билдере это реализуется так: получаем время т1 и т2, и затем т2 минус т1 получаем то что нужно. В Qt я тоже два времени получил, но они не "умеют" вычитаться друг из друга. В принципе, руками несложно "допилить" такое вычитание, но как то мне кажется должно быть готовое решение


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alex Custov от Декабрь 08, 2013, 22:23
В Qt я тоже два времени получил, но они не "умеют" вычитаться друг из друга

Ты документацию не читаешь принципиально, или это такая секта? Люди, которые никогда не читают документацию, иначе наступит конец времён ::)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 08, 2013, 22:35
Вот написал функцию, которая по миллисекундам рассчитает время:
Код
C++ (Qt)
QTime fromMSec( quint64 totalMsec )
{
   uint hour = totalMsec / 1000 / 60 / 60 % 60;
   uint minute = totalMsec / 1000 / 60 % 60;
   uint sec = totalMsec / 1000 % 60;
   uint msec = totalMsec % 1000;
 
   return QTime( hour, minute, sec, msec );
}
 

Используем так:
Код
C++ (Qt)
QTime t1 = QTime::currentTime();
 
// Выполняется какой-то код
 
// Получим разницу в миллисекундах, можно и в секундах, но лучше более высокая точность
// на всякий случай, поместим полученную разницу в модуль - нам
// не нужно отрицательное время
qint64 msec = qAbs( QTime::currentTime().msecsTo( t1 ) );
 
QTime t3 = fromMSec( msec );
qDebug() << "Всего миллисекунд: " << msec << " <=> " << t3.toString( "hh:mm:ss.zzz" );
 

ЗЫ. функция должна правильно работать, но лучше протестить ее - у меня глубокая ночь и потому мог накосячить и не заметить :)


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 22:51
Да смотрел я документацию по QTime, ничего похожего не нашёл. Да ещё по английски всё. Ну покажите тупому. У меня есть два системных времени, например 22.33.45 и 23.43.50, как мне получить 01.10.05

И вообще как-то мимо логики всё, если не сказать хуже. Допустим создаём

QTime time;

Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.

time.Start();

вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.

time.setHMS (0, 0);

обнуляет - отлично. После неё самое время бы Start - и пошли часики тикать с нуля, а не тут то было. Start опять тупо запишет в неё системное время, я проверял. Не знаю, может кому это кажется понятным, мне - нет.



 


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 08, 2013, 22:54
ЗЫ. функция должна правильно работать, но лучше протестить ее - у меня глубокая ночь и потому мог накосячить и не заметить :)
Спасибо, попробую.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 08, 2013, 23:04
Цитировать
QTime time;
Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.
time.Start();
вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.
time.setHMS (0, 0);
обнуляет - отлично. После неё самое время бы Start - и пошли часики тикать с нуля, а не тут то было. Start опять тупо запишет в неё системное время, я проверял. Не знаю, может кому это кажется понятным, мне - нет.

Просто вы не совсем правильно используете :)

Ничего не нужно обновлять
И прошедшее время с start() или restart() не появится в экземпляре QTime,
и получить его мы можем только с помощью elapsed().
Код
C++ (Qt)
QTime t;
t.start();
// выполняется какой то код
qDebug("Time elapsed: %d ms", t.elapsed());
 

Цитировать
Sets this time to the current time
void QTime::start()
{
    *this = currentTime();
}
Устанавливает в экземпляре текущее время

Цитировать
Returns the number of milliseconds that have elapsed since the last time start() or restart() was called.
int QTime::elapsed () const
{
       int n = msecsTo(currentTime());
       if (n < 0)                                // passed midnight
           n += 86400 * 1000;
       return n;
}
Возвращает количество миллисекунд, которые прошли с последнего вызова методов start() или restart().

Можете сами убедиться, вот исходный код тех функций:
http://code.woboq.org/qt5/qtbase/src/corelib/tools/qdatetime.cpp.html#_ZNK5QTime7elapsedEv


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alex Custov от Декабрь 08, 2013, 23:08
Да ещё по английски всё

В этой индустрии без английского вообще никуда. Или учи сразу, или просто не берись за это.

Допустим создаём

QTime time;

Она создаётся "пустая", если сразу её на экран, то вообще ничего не выводится, даже нулей. Ну ладно.

Естественно, дефолтный QTime - это невалидный QTime. Это документировано.

time.Start();
вовсе не заставляет её куда-то стартовать, а записывает в неё системное время. Тоже ладно.

Да, и это документировано тоже. А пройденное время доступно в elapsed().

Не знаю, может кому это кажется понятным, мне - нет.

Ты хочешь писать на Qt методом интуиции?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alex Custov от Декабрь 08, 2013, 23:08
Вот написал функцию, которая по миллисекундам рассчитает время:

Господи, сектанты отаке!!

Код
C++ (Qt)
QTime t(0, 0, 0);
qDebug() << t.addSecs(60*60*2 + 14*60 + 10); // 2h 14min 10sec
 


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 08, 2013, 23:10
Вот написал функцию, которая по миллисекундам рассчитает время:

Господи!!

Код
C++ (Qt)
QTime t(0, 0, 0);
qDebug() << t.addSecs(60*60*2 + 14*60 + 10); // 2h 14min 10sec
 

А теперь модернизируйте ваш код, чтобы он точно рассчитывал разницу времени :)

UPDATE.
Хотя не нужно, мы не гордые :)
Код
C++ (Qt)
QTime t;
t.start();
// выполняется сектанский код
int msec = t.elapsed();
 
QTime t2 = QTime(0, 0, 0).addMSecs( msec );
 
qDebug() << t2.toString("hh:mm:ss.zzz");


Название: Re: Как добавить файл .cpp в проект?
Отправлено: carrygun от Декабрь 09, 2013, 05:22
Есть же QElapsedTimer, проще помоему некуда.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Igors от Декабрь 09, 2013, 14:40
Да смотрел я документацию по QTime, ничего похожего не нашёл. Да ещё по английски всё. Ну покажите тупому.
Ну да, чего-то там читать, разбираться - да спрошу на форуме, ведь он для этого и предназначен! В конце-концов что я теряю? Так или нет?  :)

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


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 09, 2013, 14:44
Спасибо всем за помощь. Я решил сделать по другому. Таймер раз в секунду будет и время считать и количество обработанных фреймов.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 09, 2013, 19:37
Че то проблемы с таймером. Я его создал, соединил со слотом, все как положено. Таймер работает - тестовые цифирки переключаются. Но когда я нажимаю кнопку "кодирование" и начинается собственно кодирование - таймер встаёт и продолжает работу только после окончания кодирования. QApplication::processEvents(); я в слот таймера вставил - безрезультатно.

Что я сделал неправильно?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alex Custov от Декабрь 09, 2013, 20:05
QApplication::processEvents(); я в слот таймера вставил - безрезультатно.

Интересно, исходя из всего вышесказанного, зачем это было сделано? Если таймер на форме не обновляется, значит слот не вызывается, логично?

P.S. Делай кодирование в потоке чтобы не загружать основной поток.


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Igors от Декабрь 09, 2013, 20:34
Спасибо всем за помощь. Я решил сделать по другому. Таймер раз в секунду будет и время считать и количество обработанных фреймов.
Таймер работает синхронно, т.е. событие таймера приходит из очереди событий так же как и другие. Делайте выводы и не мельтешите с преждевременными вопросами


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 10, 2013, 18:17
Код
C++ (Qt)
QObject::connect(ui->pushButton_3, SIGNAL(clicked()),  qApp, SLOT(closeAllWindows()));

Можно завершать работу с программы таким образом?


Название: Re: Как добавить файл .cpp в проект?
Отправлено: gil9red от Декабрь 10, 2013, 19:02
Код
C++ (Qt)
QObject::connect(ui->pushButton_3, SIGNAL(clicked()),  qApp, SLOT(closeAllWindows()));

Можно завершать работу с программы таким образом?

Можно, если у экземпляра QApplication стоит флаг на прекращение работы проги, если все окна закрыты (или скрыты) :)

Лучше делать так:
Код
C++ (Qt)
QObject::connect(ui->pushButton_3, SIGNAL(clicked()),  qApp, SLOT(quit()));


Название: Re: Как добавить файл .cpp в проект?
Отправлено: Alexu007 от Декабрь 11, 2013, 10:05
Qt 4.7.4 или 4.8.1 в чем разница и что лучше?