Буду пионером и таки открою своим постом форум, посвященный программированию :0))
Только-только начинаю программировать под линукс.
В качестве среды разработки избрал QDevelop.
Сразу же возник вопрос из серии "а как обращаться к элементам, расположенным на форме из кода приложения?".
То есть, если создание элемента управления прописать в коде main.cpp, то сразу же можно обращаться к свойствам и значениям компанента, а если компанент создан в Qt Designer на главной форме, то добраться к этому элементу не получается, и на всплывающем треугольничке выскакивает подсказка ошибки "`название_компанента` was not declared in this scope".
Я в принципе понимаю, ругается на то, что компанент не описан каким-то образом, поэтому с ним нельзя работать.
Вопрос, а как его таки прописать, чтобы можно было на него ссылаться из кода main.cpp?
C QDevelop не работал, использую KDevelop. Напишу то, что знаю, вдруг поможет.
Qt Designer создаёт файл <имя файла>.ui. Из него потом получаются <имя файла>.h и <имя файла>.cpp, в которых содержится класс описывающий созданное окно. В main.cpp создаётся объект этого класса и выводится на экран.
К примеру: создаёшь в Qt Designer окно с именем MyWindowDlg и сохраняешь в файле fileformywindowdlg, получаешь: fileformywindowdlg.ui -> fileformywindowdlg.h,fileformywindowdlg.cpp в них класс MyWindowDlg. В main.cpp что то вроде MyWindowDlg w();. Чаще компоненты вызываются не из main.cpp, а в самом классе.
Как правило используют такой приём: в отдельном файле создают наследника от MyWindowDlg, а в main.cpp: ChldMyWindowDlg w();. Просто при пересборке fileformywindowdlg.h и fileformywindowdlg.cpp создаются заново и все изменения внесённые вручную затираются. В наследнике же всё останется как написал. QDevelop, судя по описанию, сама СРПО решает эту проблему.
В main.cpp автоматом создаётся наследник и работа происходит уже с ним.
#include <QApplication>
#include "mainwindowimpl.h"
//
int main(int argc, char ** argv)
{
QApplication app( argc, argv );
MainWindowImpl win;
win.show();
app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
return app.exec();
}
Но я не могу обратиться к элементам формы через этого наследника, то есть на win.btnOK как и на win->btnOK происходит ругань (btnOK - кнопка, созданная в дизайнере на форме).
Где-то какой-то малости не хватает, чтобы получилось нормальное обращение к компанентам, вопрос где?
Я программирую в Qt Creator, у меня эта проблема решается так:
ui(вне зависимости от названия)->элементы формы.
Не понял как-то :0((
Можно короткий примерчик?
Такой вот простенький примерчик сойдёт?
FindDialog::FindDialog(QWidget *parent)
: QDialog(parent), ui(new Ui::FindDialog)
{
ui->setupUi(this);
connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(enableFindButton(QString)));
connect(ui->findButton, SIGNAL(clicked()), this,SLOT(findClicked()));
}
void FindDialog::findClicked()
{
QString text = ui->lineEdit->text();
Qt::CaseSensitivity cs = ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseSensitive;
if (ui->searchCheckBox->isChecked()){
emit findPrev(text, cs);
}else{
emit findNext(text, cs);}
Будут вопросы, задавай ещё. А вообще советую присмотреться к Qt Creator, хорошая IDE'шка. Учитывая, что Нокия скупила TrollTech, развитие Qt Creator должно пойти в гору, в отличие от QDevelop'а... IMHO
Могу ещё одну книжку хорошую кинуть, по программированию в Qt на C++...
Моск свихнул пока что... :0((
Мда уж, на билдере под мастдай гораздо легче всё было...
Накидал компанентов на форму, дважды счёлкнул на компаненте и прописал код для реакции на событие и делов-то...
А тут, блин, думать надо...
Qt Creator поставил.
Вынес моск до следующей недели...
Примеры в видео.
Примерывесьма простенькие и показывают основные особенности и возможности Qt Creator.
Очень хорошая книга для понимания сути))
Удачи в обучении) Задавай вопросы, буду рад помочь чем смогу.
Книга такая у меня есть, сложноватая она слегка, что в некоторой степени отбивает охоту досконально разбираться в программировании под линукс.
Видео сейчас гляну, спасибо.
А что касается создания интерфейса, то это самое легкое, что есть в программировании.
Главное - код, а с ним у меня в данный момент полное непонимание...
Тогда вот тебе ещё в помощь)
Книга по C++
А вообще, могу накидать какую-нить простенькую хрень, кинуть тебе на мыло, хоть посмотришь как там что работает...
З.Ы. Создание грамотного интерфейса - вещь весьма важная и не слишком простая) Дизайн, хоткеи, лейауты и прочая фигня)
Как таковой с++ я знаю, просто в среде qt как-то ещё не освоился...
Если у тебя будет время, накидай плз проектик простой, скажем, две кнопки и надпись.
На надписи цифра, одна кнопка цифру уменьшает, а другая увеличивает.
Я так и сигналами и слотами разобраться смогу...
Как два пальца об асфальт)) Только ящик свой скажи или по аське/жабре со мной свяжись, у меня в инфе есть.
Если ещё пару часов бодрствовать будешь, то я фильм досмотрю и накидаю проектик.
Что то я не заметил работы с наследником в main.cpp, ну да ладно.
Поясни, QDevelop выдаёт такую фразу: "QPushButton was not declared in this scope" или такую: "btnOK was not declared in this scope"? Если первый вариант, то надо добавить строчку: #include в начале файла. Если второй вариант, то честно скажу, не знаю. Напиши полностью строчку, где к btnOK обращаешься, может что надумаю.
Зы. Книгу по Qt, что Fatalist посоветовал, читай обязательно. И для понимания сути и как справочник по основным пунктам полезна. Судьба наша такая - вечно учится, если уж взялись проги писать.
Фаталист меня подсадил на QT Creator.
Там понятно что к чему, я посмотрел ролики о начале работы на QT Creator на трубе.
Фаталист мне ещё показал простенький примерчик работы. Теперь более-менее я освоился с инструментарием.
В QT Creator работает конструкция ui->имя_элемента и таким образом можно добраться до свойств любого компанента.
"Фаталист подсадил..."
Чувствую себя теперь прямо пушером каким-то)) Извиняйте за оффтоп, не сдержался..
Нормально, среда программирования оказалась вполне дружелюбной, после просмотра нескольких роликов на трубе.
До этого ставил QT Creator, но абсолютно не мог понять что к чему...
Теперь осталось только книгу Бланшета-Саммерфильда осилить и тогда проникнешься окончательно)
Здравствуйте! Я недавно пишу на Qt, и у меня есть проблема.
Нужно выводить на форму системное время и дату в компонент QDateTimeEdit. Форму создаю в QtDesigner. Чтобы время "тикало", понятно - нужен таймер. В книге Макса Шлее есть пример с выводом времени в QLabel, но у меня не получилось переделать его под свои нужды.
Прошу прощения, но дальше код будет на словах, т.к. форум нашла случайно, а исходники на работе.
В файле clock.h описываю класс: в нем таймер, слот для обновления времени и даты и вывода информации на экран;
в файле main.cpp создаю экземпляр класса. Все компилируется, но на форме в компоненте нули! Понимаю, ошибка глупая, но не вижу ее.
(может, я случайно отправила сообщение 2 раза - не баньте меня, пожалуйста)
Вот пример наглядный и ооочень простой, анализируй :)
А не сибнетовцы разве могут туда попасть?
на mix точно не пускает
У меня грузится.
RA9OAJ, спасибо за пример! Я сделала немного по-другому:
файл clock.h
#include <qapplication.h>
#include <qwidget.h>
#include <qdatetime.h>
#include <qdatetimeedit.h>
#include <qtimer.h>
#include "form1.h"
class Clock : public QWidget {
Q_OBJECT
private:
QTimer *ptimer;
Form1 *v;
public:
Clock(Form1 *vv)
{
v=vv;
ptimer = new QTimer((QWidget*)this);
connect(ptimer, SIGNAL(timeout()), SLOT(slotUpdateDateTime()));
ptimer->start(500);
slotUpdateDateTime();
}
public slots:
void slotUpdateDateTime()
{
v->dte->setDateTime(QDateTime::currentDateTime());
v->dte->repaint();
}
};
файл main.cpp
#include <qapplication.h>
#include <qdatetimeedit.h>
#include "form1.h"
#include <clock.h>
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
Form1 *w = new Form1;
w->show();
Clock MyClock(w);
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
return a.exec();
}
в конструкторе Clock надо вызывать конструктор папы, иначе объект не убивается, если окошко уже умерло.
Clock(Form1 *vv): QWidget(vv)
А вообще выносить в отдельный класс тикалку не обязательно... можно было сделать у Form1 некий слот с обновлением часов, в конструкторе у ней инициализировать таймер. меньше мусора.
Спасибо большое! Учту на будущее.
Еще у меня есть одна просьба (если можно, я размещу ее здесь): можете ли Вы посоветовать мне такой учебник, в котором были бы описаны простейшие функции:
перевод средствами Qt Qstring в int;
работа с виджетами (например, как заставить qdial повернуться на указанное в lineedit количество градусов) - т.е. взаимосвязь виджетов.
У М.Шлее кое-что описано, но самых простых действий нет, и у Бланшет тоже нет.
Заранее спасибо!
На русском адекватной документации нет.
Перевод строки в числа см. QString::toInt.
У QLineEdit есть сигнал textChanged(QString). Пишем свой слот, если ввод верный, конвертируем текст в число. для QDial вызываем setValue().
ktchv, спасибо за ответ!
Может быть, что-то порекомендуете на английском языке?
В документации которая на сайте и в Qt-Creator есть всё.
Я дал ссылку в предыдущем комменте. Ещё есть инфа тут
Отправить комментарий