Ошибка в QDevelop: "`название_компанента` was not declared in this scope"

Изображение пользователя Condor.

Буду пионером и таки открою своим постом форум, посвященный программированию :0))
Только-только начинаю программировать под линукс.
В качестве среды разработки избрал QDevelop.
Сразу же возник вопрос из серии "а как обращаться к элементам, расположенным на форме из кода приложения?".
То есть, если создание элемента управления прописать в коде main.cpp, то сразу же можно обращаться к свойствам и значениям компанента, а если компанент создан в Qt Designer на главной форме, то добраться к этому элементу не получается, и на всплывающем треугольничке выскакивает подсказка ошибки "`название_компанента` was not declared in this scope".
Я в принципе понимаю, ругается на то, что компанент не описан каким-то образом, поэтому с ним нельзя работать.
Вопрос, а как его таки прописать, чтобы можно было на него ссылаться из кода main.cpp?

0
_KoT_ - 19 Июль, 2009 - 00:26
Изображение пользователя _KoT_.

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, судя по описанию, сама СРПО решает эту проблему.

0
Condor - 19 Июль, 2009 - 10:13
Изображение пользователя Condor.

В 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 - кнопка, созданная в дизайнере на форме).
Где-то какой-то малости не хватает, чтобы получилось нормальное обращение к компанентам, вопрос где?

0
Fatalist - 19 Июль, 2009 - 10:41
Изображение пользователя Fatalist.

Я программирую в Qt Creator, у меня эта проблема решается так:
ui(вне зависимости от названия)->элементы формы.

0
Condor - 19 Июль, 2009 - 12:27
Изображение пользователя Condor.

Не понял как-то :0((
Можно короткий примерчик?

0
Fatalist - 19 Июль, 2009 - 12:42
Изображение пользователя Fatalist.

Такой вот простенький примерчик сойдёт?

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
Condor - 19 Июль, 2009 - 12:46
Изображение пользователя Condor.

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

0
Condor - 19 Июль, 2009 - 12:51
Изображение пользователя Condor.

Qt Creator поставил.
Вынес моск до следующей недели...

+2
Fatalist - 19 Июль, 2009 - 13:18
Изображение пользователя Fatalist.

Примеры в видео.
Примерывесьма простенькие и показывают основные особенности и возможности Qt Creator.

Очень хорошая книга для понимания сути))

Удачи в обучении) Задавай вопросы, буду рад помочь чем смогу.

0
Condor - 19 Июль, 2009 - 13:36
Изображение пользователя Condor.

Книга такая у меня есть, сложноватая она слегка, что в некоторой степени отбивает охоту досконально разбираться в программировании под линукс.
Видео сейчас гляну, спасибо.
А что касается создания интерфейса, то это самое легкое, что есть в программировании.
Главное - код, а с ним у меня в данный момент полное непонимание...

0
Fatalist - 19 Июль, 2009 - 14:14
Изображение пользователя Fatalist.

Тогда вот тебе ещё в помощь)
Книга по C++

А вообще, могу накидать какую-нить простенькую хрень, кинуть тебе на мыло, хоть посмотришь как там что работает...

З.Ы. Создание грамотного интерфейса - вещь весьма важная и не слишком простая) Дизайн, хоткеи, лейауты и прочая фигня)

0
Condor - 19 Июль, 2009 - 18:20
Изображение пользователя Condor.

Как таковой с++ я знаю, просто в среде qt как-то ещё не освоился...
Если у тебя будет время, накидай плз проектик простой, скажем, две кнопки и надпись.
На надписи цифра, одна кнопка цифру уменьшает, а другая увеличивает.
Я так и сигналами и слотами разобраться смогу...

0
Fatalist - 19 Июль, 2009 - 18:51
Изображение пользователя Fatalist.

Как два пальца об асфальт)) Только ящик свой скажи или по аське/жабре со мной свяжись, у меня в инфе есть.

Если ещё пару часов бодрствовать будешь, то я фильм досмотрю и накидаю проектик.

0
_KoT_ - 19 Июль, 2009 - 19:15
Изображение пользователя _KoT_.

Что то я не заметил работы с наследником в main.cpp, ну да ладно.
Поясни, QDevelop выдаёт такую фразу: "QPushButton was not declared in this scope" или такую: "btnOK was not declared in this scope"? Если первый вариант, то надо добавить строчку: #include в начале файла. Если второй вариант, то честно скажу, не знаю. Напиши полностью строчку, где к btnOK обращаешься, может что надумаю.
Зы. Книгу по Qt, что Fatalist посоветовал, читай обязательно. И для понимания сути и как справочник по основным пунктам полезна. Судьба наша такая - вечно учится, если уж взялись проги писать.

0
Condor - 20 Июль, 2009 - 11:49
Изображение пользователя Condor.

Фаталист меня подсадил на QT Creator.
Там понятно что к чему, я посмотрел ролики о начале работы на QT Creator на трубе.
Фаталист мне ещё показал простенький примерчик работы. Теперь более-менее я освоился с инструментарием.
В QT Creator работает конструкция ui->имя_элемента и таким образом можно добраться до свойств любого компанента.

0
Fatalist - 20 Июль, 2009 - 11:58
Изображение пользователя Fatalist.

"Фаталист подсадил..."
Чувствую себя теперь прямо пушером каким-то)) Извиняйте за оффтоп, не сдержался..

0
Condor - 21 Июль, 2009 - 13:50
Изображение пользователя Condor.

Нормально, среда программирования оказалась вполне дружелюбной, после просмотра нескольких роликов на трубе.
До этого ставил QT Creator, но абсолютно не мог понять что к чему...

0
Fatalist - 21 Июль, 2009 - 14:42
Изображение пользователя Fatalist.

Теперь осталось только книгу Бланшета-Саммерфильда осилить и тогда проникнешься окончательно)

0
vilen - 15 Август, 2011 - 21:49

Здравствуйте! Я недавно пишу на Qt, и у меня есть проблема.
Нужно выводить на форму системное время и дату в компонент QDateTimeEdit. Форму создаю в QtDesigner. Чтобы время "тикало", понятно - нужен таймер. В книге Макса Шлее есть пример с выводом времени в QLabel, но у меня не получилось переделать его под свои нужды.
Прошу прощения, но дальше код будет на словах, т.к. форум нашла случайно, а исходники на работе.
В файле clock.h описываю класс: в нем таймер, слот для обновления времени и даты и вывода информации на экран;
в файле main.cpp создаю экземпляр класса. Все компилируется, но на форме в компоненте нули! Понимаю, ошибка глупая, но не вижу ее.
(может, я случайно отправила сообщение 2 раза - не баньте меня, пожалуйста)

0
RA9OAJ - 16 Август, 2011 - 09:22
Изображение пользователя RA9OAJ.

Вот пример наглядный и ооочень простой, анализируй :)

0
Жюстина - 16 Август, 2011 - 09:47
Изображение пользователя Жюстина.

А не сибнетовцы разве могут туда попасть?

на mix точно не пускает

+1
DarkneSS - 16 Август, 2011 - 10:30
Изображение пользователя DarkneSS.

У меня грузится.

0
vilen - 24 Август, 2011 - 21:05

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();
}

0
ktchv - 26 Август, 2011 - 11:37
Изображение пользователя ktchv.

в конструкторе Clock надо вызывать конструктор папы, иначе объект не убивается, если окошко уже умерло.

Clock(Form1 *vv): QWidget(vv)

А вообще выносить в отдельный класс тикалку не обязательно... можно было сделать у Form1 некий слот с обновлением часов, в конструкторе у ней инициализировать таймер. меньше мусора.

0
vilen - 20 Сентябрь, 2011 - 21:02

Спасибо большое! Учту на будущее.
Еще у меня есть одна просьба (если можно, я размещу ее здесь): можете ли Вы посоветовать мне такой учебник, в котором были бы описаны простейшие функции:
перевод средствами Qt Qstring в int;
работа с виджетами (например, как заставить qdial повернуться на указанное в lineedit количество градусов) - т.е. взаимосвязь виджетов.
У М.Шлее кое-что описано, но самых простых действий нет, и у Бланшет тоже нет.
Заранее спасибо!

0
ktchv - 21 Сентябрь, 2011 - 12:31
Изображение пользователя ktchv.

На русском адекватной документации нет.
Перевод строки в числа см. QString::toInt.

У QLineEdit есть сигнал textChanged(QString). Пишем свой слот, если ввод верный, конвертируем текст в число. для QDial вызываем setValue().

0
vilen - 22 Сентябрь, 2011 - 20:37

ktchv, спасибо за ответ!
Может быть, что-то порекомендуете на английском языке?

0
mft - 23 Сентябрь, 2011 - 09:23

В документации которая на сайте и в Qt-Creator есть всё.

0
ktchv - 26 Сентябрь, 2011 - 14:22
Изображение пользователя ktchv.

Я дал ссылку в предыдущем комменте. Ещё есть инфа тут

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры