Russian Qt Forum
Сентябрь 30, 2024, 14:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос 2: простейший вопрос по QLabel и соnnect без классов.  (Прочитано 7369 раз)
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();
}
« Последнее редактирование: Июль 24, 2009, 13:52 от Silence » Записан
ufna
Гость
« Ответ #1 : Июль 24, 2009, 09:47 »

Когда у тебя вызывается слот, объект label не создан. Т.к. ты его не создаешь, потому как
Код
C++ (Qt)
QLabel *label = new QLabel;
не имеет ничего общего с MyDialog::label

Правильно будет:
Код
C++ (Qt)
label = new QLabel;
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Июль 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");
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Silence
Гость
« Ответ #3 : Июль 24, 2009, 09:49 »


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

тема закрыта..
Записан
Silence
Гость
« Ответ #4 : Июль 24, 2009, 09:59 »

Классика.

ребята, спасибо!
не ленитесь даже на такие простые вопросы отвечать..
респект!
Записан
Silence
Гость
« Ответ #5 : Июль 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");  
 
}
Записан
Khs
Гость
« Ответ #6 : Июль 24, 2009, 14:15 »

мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен Улыбающийся
Записан
Silence
Гость
« Ответ #7 : Июль 24, 2009, 14:17 »

мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен Улыбающийся

да, этим и постоянно занимаюсь.. скачал книг. читаю.. листаю форумы.. читаю доки.. енглиш форумы рою..
но именно это пока не нашёл..  сорри )
Записан
Silence
Гость
« Ответ #8 : Июль 24, 2009, 14:21 »

мне кажется надо почитать маны по программированию, ибо чувствую что дальше от тебя будет Вопрос N, где N - неопределен Улыбающийся

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

мир не без добрых людей )
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июль 24, 2009, 14:31 »

как это сделать без классов? просто на функциях..

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Июль 24, 2009, 14:33 »

почему же - сделать QLabel глобальной переменной, но это очень плохой стиль программирования
Записан
Silence
Гость
« Ответ #11 : Июль 24, 2009, 14:36 »

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

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

пробовал уже через глобальные - переносил
QLabel *label = new QLabel; наверх.
ошибок не показывает... но если запускать экзешник - просто ничего не выдается.. окошко виджета не открывается даже )
Записан
denka
Гость
« Ответ #12 : Июль 24, 2009, 14:39 »

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

И куда мы слот прилепим? Улыбающийся

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

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

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

Читай здесь http://doc.qtsoftware.com/4.5/signalsandslots.html. Слот должен быть обязательно членом класса унаследованного от QObject. Так же класс должен содержать макросс Q_OBJECT
« Последнее редактирование: Июль 24, 2009, 14:43 от den'ka » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Июль 24, 2009, 16:23 »

сдается мне нужно перенести в глобальные объявление переменной, а инициализацию оставить там где было (иначе она создается до QApplication'а, что, наверное, нехорошо)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Июль 24, 2009, 20:54 »

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.5 секунд. Запросов: 23.