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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятный глюк со слотами  (Прочитано 3904 раз)
FreePascal
Гость
« : Август 08, 2010, 01:23 »

Система kubuntu 10.04.
QT 4.6.2  из репа.

Проблема в том что вызывая любой метод QLabel или QLineEdit(другие виджеты не проверял) внутри слота(в коде ето MainWindow::btnClicked()) апликация валится с сообщением "Segmentation fault".
В то же время в обычных функциях, допустим как тут в конструкторе, все работает замечательно.
Где то moc загоняется.

Давно нечего не писал на QT, может я что-то упустил?


Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QPushButton>
#include <QLabel>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);

private:
    QLabel *m_label;
    QPushButton *m_button;

private slots:
    void btnClicked();

};

#endif // MAINWINDOW_H
Код:
#include "mainwindow.h"
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QLabel *m_label = new QLabel(this);
    QPushButton *m_button = new QPushButton("Click", this);
    connect(m_button, SIGNAL(clicked()), this, SLOT(btnClicked()));

    QVBoxLayout *layout = new QVBoxLayout();
    layout->addWidget(m_label);
    layout->addWidget(m_button);

    setCentralWidget(new QWidget(this));
    centralWidget()->setLayout(layout);

    m_label->setText("TTTTTTTTTT");
}


void MainWindow::btnClicked()
{
    m_label->setText("fdsfdsfdsf");
}
Записан
BRE
Гость
« Ответ #1 : Август 08, 2010, 08:36 »

moc здесь не причем.

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
   m_label = new QLabel(this);
   m_button = new QPushButton("Click", this);
   ...
}
 
Записан
FreePascal
Гость
« Ответ #2 : Август 08, 2010, 10:53 »

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

Большое спасибо.
Вы правы тут не то что moc не причем, тут то и сам QT не при чем.
Записан
SASA
Гость
« Ответ #3 : Август 08, 2010, 13:27 »

Я советую обявлыть данные так
Код:
    QPointer<QLabel> m_label;
    QPointer<QPushButton> m_button;
А использовать так
Код:
if(m_label)
    m_label->setText("fdsfdsfdsf");

Ошибка осталась бы, но приложение не падало.
Записан
alexman
Гость
« Ответ #4 : Август 08, 2010, 13:44 »

Я советую обявлыть данные так
Код:
    QPointer<QLabel> m_label;
    QPointer<QPushButton> m_button;
А использовать так
Код:
if(m_label)
    m_label->setText("fdsfdsfdsf");
Ошибка осталась бы, но приложение не падало.
Зачем лишние проверки, если точно известно, что память выделяется в конструкторе и нигде не удаляется?
« Последнее редактирование: Август 08, 2010, 13:46 от alexman » Записан
ufna
Гость
« Ответ #5 : Август 08, 2010, 17:25 »

на десктопах обычно незачем, а на том же WinCE - частенько надо, если по-хорошему

хотя обычно не делаю, ибо нагружает излишне - лучше сразу о вопросах памяти думать
Записан
SASA
Гость
« Ответ #6 : Август 10, 2010, 12:07 »

Зачем лишние проверки, если точно известно, что память выделяется в конструкторе и нигде не удаляется?
Опыт подсказывает.
В программе обчно тысячи указателей. И уследить, чтоб каждый был валидным очень сложно. Поменяли прогрумму и память выделяется другом месте и... получаем разгневаного юзера. Я работаю по простому правилу: работаешь с указателем - проверь сначала на валидность. Одна строка лишнего кода, зато куча сэканомленого времени на отладку.

P.S. И не забывайте про ASEERTы.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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