Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   QT Designer (http://forum.oszone.net/showthread.php?t=29354)

hasherfrog 27-05-2004 14:01 203492

Данный топик создан в помощь всех, кто работает с Qt и пользуется Qt Desiger при создании приложений. У меня накоплен большой опыт работы с Qt под Linux.  Но некоторые вещи ставят в тупик. Если у кого-то будут вопросы, задавайте их здесь.
Внимание! Данная тема предназначена для обсуждения вопросов, связанных не с работой Qt вообще, только дизайнера!

Мой вопрос: Qt designer внезапно стал некорректно работать. При редактировании свойств виджетов, при редактировании имени кнокпа Del на нумпаде стала удалять не букву в имени, а сам виджет. При этом "отдельный" Del (в ряду из 6 кнопочек) работает нормально. Можно, конечно, пользоватьтся  им, или BackSpace'ом, но я всю жизнь работал на нумпаде. Стрелочки на нумпаде работают как обычно. WTF? Бесит страшно...

Dimon 28-09-2004 17:09 203493

hasherfrog
Мой вопрос относится и к дизайнеру и к KDevelop'у, поэтому задам его здесь. ;)
Значит так, разрабатываю в КДевелопе с помощью дизайнера проект. Называется SigCreate. Создал проект, вызываю дизайнер, создаю в нем форму, сохраняю с именем sigcreatedlg.ui. Потом из этого .ui файла создаю файлы sigcreatedlg.h и sigcreatedlg.cpp посредством uic (т.к. КДевелоп почему-то сам это не делает). Подключаю их к проекту и наследую созданный KDevelop'ом класс SigCreate из класса диалога, созданного в Qt Designer'e. После компилю, а мне - куча ошибок типа:
Код:

sigcreate.h:35: parse error before `{' token
sigcreate.h:36: virtual outside class declaration
...
sigcreate.h:36: warning: `QString trUtf8(const char*, const char*)' declared

Я так понимаю, что создав в дизайнере форму SigCreateDlg для передачи ее в КДевелоп я должен унаследовать основной его класс SigCreate от класса SigCreateDlg.  Если да, тогда в чем может быть ошибка, если нет - тогда как работает механизм передачи информации от разработанной формы в КДевелоп?  
Файлы все прописаны и подключены. КДевелоп вроде не глючит: пробовал на 2.1.5 и на 3.0. Qt -3.1.2, Slackware-9.0, 2.4.22

hasherfrog 29-09-2004 13:35 203494

Dimon
Я прошу прощения, но с KDevelop я "завязал". Почти сразу. Более глючного ПО я даже на Линуксе не видел. Несмотря на все его плюсы и навороченность.
Что касается вопроса, меня смущает "создаю файлы ... посредством uic". Если пользоваться qmake'ом, проблем нет. Если же вручную вызывать uic и moc, надо хорошо представлять себе их "принцип действия" (могу только отослать к руководству qt).

Dimon 29-09-2004 17:47 203495

hasherfrog
Цитата:

"создаю файлы ... посредством uic". Если пользоваться qmake'ом, проблем нет. Если же вручную вызывать uic и moc, надо хорошо представлять себе их "принцип действия" (могу только отослать к руководству qt).
Дык а что там сложного? Из .ui файла двумя командами получаю хэдеры и исходник. А делаю сам потому, что КДевелоп сам это не делает.
По-поводу обмена информацией между формой, созданной в Дизайнере и КДевелопом я верно мыслю?

hasherfrog 30-09-2004 10:51 203496

moc. Где moc? Если форма, то скорее всего - QOBJECT. Следовательно, и moc.

Dimon 30-09-2004 17:29 203497

hasherfrog
А можно краткий экскурс сделать, так сказать? Что за moc? Проведи небольшой ликбез, если можно. :)

Добавлено:

И что посоветуешь использовать вместо KDevelop'a? Чтобы была интеграция с Qt Designer'ом? Anjuta - она вроде для GTK? C-Forge - с ним я так и не разобрался?
VIM/Emacs + autotools + gmake не предлагать. :)

hasherfrog 01-10-2004 12:07 203498

Очень кратко по поводу moc и uic.
uic превращает xml-содержимое файла описания формы .ui в .h и .cpp файлы. А moc создаёт из любого файла (чаще всего из .h) с директивой QOBJECT файл moc_xxxx.cpp, в котором будет имплементэйшн собственно QObject. Вот Вы готорите, этот мой класс будет КуОбъект. А где все методы, определяемые требованиями класса QObject? Например, property(), classname() и т.д.? Чтобы Вам их не писать руками, они создаются автоматом - именно moc'ом. Раньше был глюк, кстати - два QOBJECT на один .h давали сбои при компиляции. Сейчас вроде нет.

Это всё очень примитивно описано, почитайте всё же доки qt, там найдёте много интересного.

По поводу среды программирования: я использую KDE-> xterm[[bash]]-> designer& -> mc->qmake->make. Остальное только по мере надобности. Хватает с головой. KDeveloper пытался использовать только когда хотел поизучать  KDE. Но глюки... В последний раз, после Вашего вопроса, попытался запустить - завис где-то после 2-й минуты. Наверное, у меня руки не оттуда растут.

Dimon 01-10-2004 14:25 203499

hasherfrog
Прежде всего, если ты не против - давай на "Ты" :)
Цитата:

Очень кратко по поводу moc и uic.
Ага, понял, спасибо. Мне сама суть нужна, а там - разберусь...
Цитата:

Это всё очень примитивно описано, почитайте всё же доки qt, там найдёте много интересного.
Да я ищу, только что-то пока не нашел ничего... Док-то много... И интересного тоже много... :)
В КДевелоп-доках нашел, для чего .ui - файл используется, я это и так знал, но механизм обмена данными и как "брюки превращаются..." не описан: сказано "Вам не надо беспокоится - за вас это сделает КДевелоп". :)
Просто я не пойму: или я где-то в чем-то ошибся, при создании приложения, или КДевелоп глючит - бывало и такое...

Спасибо за помощь!  :)

Dimon 11-10-2004 19:05 203500

Такой вот еще вопрос: нужно в приложении организовать полноценную командную строку. Для этого нужно разбивать исходную строку на подстроки, выделять параметры, конвейеры, перенаправления ввода-вывода и т.д Например: ls -ls /home/dim|grep myfile*|sort>myfiles. Вручную все это разбивать и проверять непросто...
Вопрос: есть ли соответствующие объекты, которые могут разбирать командную строку (command line parsing) или вообще, ее, эту строку, организовывать?  

ivank 11-10-2004 20:41 203501

Dimon
При чём тут QT Designer?
Не проще ли передавать всё это сразу башу? Или надо просто разобрать? Тогда поможет yacc, я где-то видел грамматику bash скриптов. Очень может быть, что даже в исходниках самого баша :) В любом случае, поможет гугл.

Dimon 11-10-2004 23:52 203502

ivank
Цитата:

При чём тут QT Designer?
Не проще ли передавать всё это сразу башу
Пардон, а как я это все сразу передам?
Есть QProcess, у него есть метод addArgument. если я просто загоняю в него всю строку и посылаю на запуск - не работает, если же разбиваю на аргументы - работает. Как дальше быть?
А дизайнер тут при том, что может быть есть такой виджет, который уже реализует командную строку.

Не смейтесь сильно, если вопросы сильно ламеризмом попахивают - это моя первая прога под Qt. Делайте скидку...

ivank 12-10-2004 00:41 203503

Суть в том, что QT тут в общем н присём. можно просто выполнить /bin/sh с единственным параметром - то, что ввели в коммандной строке. Потом считать. Смотреть в сторону popen(), если не ошибаюсб.

А лучше не каждый раз порождать /bin/sh для выполнения одной строчки. А родить раз, а затем просто строчку ему скармливать и брать её результат. Честно говоря, не уверен как это проще сделать. Наверно, всё же придётся создавать трубу (pipe). Вообще говоря, юниксовый программер из меня тот ещё, поэтому это наверняка не лучшее решение.

И до кучи: если хочется самому парсить строчку: http://www.google.ru/search?hl=ru&am...arsing&lr=

Добавлено:

н присём = не причём

Dimon 12-10-2004 14:13 203504

Мда, прогнал я вчера конкретно. :( Сегодня вроде разобрался...

В общем, организовал командную строку пока так:
Код:

connect ( cmd_line, SIGNAL(readyReadStdout()), this, SLOT(slotReadFromStdout()) );       
...
cmd_line->setArguments("/bin/bash");
cmd_line->addArgument("-c");
cmd_line->addArgument(arg); // Entered command.
exit_status=cmd_line->start(0);
...
void lab1::slotReadFromStdout()
{
        consoleTextEdit->append( cmd_line->readStdout()  );
}

Такие вот выражения, типа ls /home/dim>1|sort && cat 1 вроде работают.

hasherfrog 12-10-2004 14:30 203505

Dimon
Только маленький совет: протестируйте как следует потом своё приложение. Особенно обратите внимание на "затопление" выходной/выходной трубы :) При большом количестве строк, передаваемых туда и извлекаемых оттуда, идут глюки. Кррр, долго объяснять, если столкнётесь вдруг, я расскажу...

Dimon 12-10-2004 15:30 203506

hasherfrog
Ммм, немного не понял.
Я вызваю приложение по start(), оно отработало и я завершаю его по closeStdin(), tryTerminate() или вообще по kill(). И что,  глюки могут быть во время работы приложения, когда я буду посылать строки, с помощью например writeToStdin() или забирать строки по readStdout() ? И какие именно глюки, чтобы я смог их распознать и ликвидировать. Или обозвать фичей приожения. :)

hasherfrog 12-10-2004 15:50 203507

Визуально это будет выглядеть так:
1. Вы посылаете башу 5 команд(строк).
2. баш получает 1 строку, обрабатывает, возвращает результат.
3. Вы ждёте ответа на ещё четыре команды - до пенсии.
Как вариант, Вы устаёте ждать и...
3а. Вы посылаете ещё одну команду.
4а. Баш возвращает ответ на ранее посланные 4 + ответ последнюю.

Dimon 19-10-2004 15:27 203508

Такой еще вопрос: внятно объясните пожалуйста, как пользваться Spacer'ами? Каков механизм их работы? Какие есть общие рекомендации при их использовании? А то нигде ничего по существу не написано, или написано, что, мол, выравниванием можно овладеть только методом проб и ошибок. А этот самый метод пока не дает результатов...

hasherfrog 19-10-2004 20:50 203509

Цитата:

выравниванием можно овладеть только методом проб и ошибок.
:lol: Не знаю, где Вы это прочитали, но это удивительно точное описание. В процессе создания формы приходится поизгалятся, чтобы она под разными wm выглядела прилично.
Как научится пользоватся (и принцип действия) - это сразу становится понятным, когда Вы начинаете ресайзить форму (диалог). Если контролсы ведут себя "неприлично", нужно спейсеров добавить. Только не увлекайтесь. Как правило 2-х хватает за глаза.
И маленький совет: поменьше объединяйте контролсы в группы.

Dimon 19-10-2004 21:26 203510

hasherfrog
Цитата:

Не знаю, где Вы это прочитали, но это удивительно точное описание.
Да нашел одну статью на kde.org - вот там такое и написано. Очень информативно и крайне познавательно...
Для чего нужны спэйсеры я понимаю. Но вот принцип их работы - все никак не раскушу. Ну хоть в двух словах основные положения, так сказать, можно узнать?

hasherfrog 20-10-2004 12:34 203511

Dimon
Не совсем понял вопрос. Принцип работы стоит посмотреть в исходниках QT, наверное?..

Dimon 20-10-2004 14:10 203512

hasherfrog
Ммм, попробую объсяснить.
Спэйсеры нужны для того, чтобы динамически перемещать объекты по форме при изменении ее размеров. Т.е. при изменении размера формы спэйсеры как бы "отталкивают" один элемент от другого равномерно размещаяя их по форме. В принципе понятно. В теории...
На практике же я не пойму следующего: как мне привязать элемент формы к ее границам? А то получается, что при разворачивании формы на весь экран у меня все элементы ползут влево и вверх. Я ставлю по бокам элемента эти спейсеры, но ничего не меняется - все равно уходит влево и вверх...

hasherfrog 21-10-2004 09:31 203513

Спейсеры в Вашем случае надо ставить "между".
Код:

+-----------------------+
|
|
|
| !~~~~~~~~~~~! [Button]    <- кнопка будет "держатся" правой границы окна
+-----------------------+

[s]Исправлено: hasherfrog, 9:33 21-10-2004[/s]

Dimon 23-10-2004 20:34 203514

hasherfrog
Все, разобрался, спасибо.
Просто я после "объединения" всех элементов формы в один слой не делал выравнивание этого слоя относительно всей формы.

Interceptor 24-10-2004 01:33 203515

У меня вопрос:
  QT - freeware? (для коммерческого использования)

hasherfrog 25-10-2004 10:14 203516

SW
Не совсем ;)

Dimon Я же говорил, не увлекайтесь объединениями :)

krestik 19-04-2006 15:18 429570

Хочу установить Qt под Windows. Он просит mingw.Где взять?Я новичок

hasherfrog 05-05-2006 11:12 434566

krestik
Вопросом на вопрос не принято, но всё-таки. А почему обязательно mingw?
Брать тут: http://www.mingw.org/

hasherfrog 05-05-2006 14:36 434672

krestik
Ууу, понял. Вы 4-й QT схватили :]
Тогда тут: ftp://ftp.trolltech.com/misc/


Время: 22:40.

Время: 22:40.
© OSzone.net 2001-