Russian Qt Forum

Qt => Общие вопросы => Тема начата: Silence от Июль 24, 2009, 09:38



Название: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Silence от Июль 24, 2009, 09:38
привет.
простейший код..  запускаю на винде ХР - и при нажатии кнопки вылетает программа ((
смысл проги - нажимаем на кнопку - запускается функция - в ней меняется текст в label
исходник:

Код
C++ (Qt)
#include "click.h"
 
MyDialog::MyDialog(): QDialog() {
 
   QGridLayout *layout = new QGridLayout(this);    
 
   m_btn1 = new QPushButton(tr("BTN"), this);
   connect(m_btn1, SIGNAL(clicked()), this, SLOT(onClick()));
   layout->addWidget(m_btn1, 0, 0);
 
   QLabel *label = new QLabel;
   label->setText("label");
   layout->addWidget(label, 0, 1);  
 
   setLayout(layout);
}
 
void MyDialog::onClick() {
   label->setText("text");  //zdes ne rabotaet ((
}
 
int main(int argc, char *argv[]) {
   QApplication app(argc, argv);
   QTextCodec *codec = QTextCodec::codecForName("CP1251");
   QTextCodec::setCodecForTr(codec);
 
   MyDialog dlg;
   dlg.show();
   return app.exec();
}


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: ufna от Июль 24, 2009, 09:47
Когда у тебя вызывается слот, объект label не создан. Т.к. ты его не создаешь, потому как
Код
C++ (Qt)
QLabel *label = new QLabel;
не имеет ничего общего с MyDialog::label

Правильно будет:
Код
C++ (Qt)
label = new QLabel;


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: pastor от Июль 24, 2009, 09:48
Классика.

Объяви label членом класса. И немного измени конструктор:

Код
C++ (Qt)
class MyDialog : .....
{
....
private:
   QLabel *m_label;
};
 
 
MyDialog::MyDialog(): QDialog() {
.....
   m_label = new QLabel;
.....
}
 
void MyDialog::onClick() {
   m_label->setText("text");
}


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: Silence от Июль 24, 2009, 09:49

уважаемый, спасибо большое!!!

тема закрыта..


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: Silence от Июль 24, 2009, 09:59
Классика.

ребята, спасибо!
не ленитесь даже на такие простые вопросы отвечать..
респект!


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: Silence от Июль 24, 2009, 13:49
еще глупый вопрос.. )
как это сделать без классов? просто на функциях..
как в функцию передавать адрес на label чтобы сменить его?
понимаю, что в функции label не доступна.. как сделать доступ к изменению?

Код
C++ (Qt)
#include <QtGui>
 
void onClick();
 
int main(int argc, char *argv[]){
   QApplication app(argc, argv);
   QWidget win;
   QGridLayout* layout = new QGridLayout(&win);
 
 
   QLabel *label = new QLabel;
   QPushButton *m_btn1 = new QPushButton("start", &win);
   QObject::connect(m_btn1, SIGNAL(clicked()), &win, SLOT(onClick()));
   layout->addWidget(m_btn1, 0, 0);
 
 
   label->setText("label");
   layout->addWidget(label, 1, 0);
 
   win.setLayout(layout);
   win.show();
   return app.exec();
}
 
void onClick() {
   label->setText("text");  
 
}


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Khs от Июль 24, 2009, 14:15
мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен :)


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Silence от Июль 24, 2009, 14:17
мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен :)

да, этим и постоянно занимаюсь.. скачал книг. читаю.. листаю форумы.. читаю доки.. енглиш форумы рою..
но именно это пока не нашёл..  сорри )


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Silence от Июль 24, 2009, 14:21
мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен :)

надеюсь на опыт других новичков, которым будет не сложно ответить на мои новичковые вопросики )
спасибо )

мир не без добрых людей )


Название: Re: простейший вопрос по QLabel и соnnect
Отправлено: pastor от Июль 24, 2009, 14:31
как это сделать без классов? просто на функциях..

В данном случае никак


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Авварон от Июль 24, 2009, 14:33
почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Silence от Июль 24, 2009, 14:36
почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования

да, согласен - ужасный ) но для той задачи, что нужно сделать - вполне достаточно..

пробовал уже через глобальные - переносил
QLabel *label = new QLabel; наверх.
ошибок не показывает... но если запускать экзешник - просто ничего не выдается.. окошко виджета не открывается даже )


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: denka от Июль 24, 2009, 14:39
почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования

И куда мы слот прилепим? :)

почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования

да, согласен - ужасный ) но для той задачи, что нужно сделать - вполне достаточно..

пробовал уже через глобальные - переносил
QLabel *label = new QLabel; наверх.
ошибок не показывает... но если запускать экзешник - просто ничего не выдается.. окошко виджета не открывается даже )

Читай здесь http://doc.qtsoftware.com/4.5/signalsandslots.html (http://doc.qtsoftware.com/4.5/signalsandslots.html). Слот должен быть обязательно членом класса унаследованного от QObject. Так же класс должен содержать макросс Q_OBJECT


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: Авварон от Июль 24, 2009, 16:23
сдается мне нужно перенести в глобальные объявление переменной, а инициализацию оставить там где было (иначе она создается до QApplication'а, что, наверное, нехорошо)


Название: Re: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.
Отправлено: pastor от Июль 24, 2009, 20:54
почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования

Я имел ввиду объявления слота вне класса