Russian Qt Forum

Qt => Общие вопросы => Тема начата: FreePascal от Август 08, 2010, 01:23



Название: Непонятный глюк со слотами
Отправлено: 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");
}


Название: Re: Непонятный глюк со слотами
Отправлено: BRE от Август 08, 2010, 08:36
moc здесь не причем.

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
   m_label = new QLabel(this);
   m_button = new QPushButton("Click", this);
   ...
}
 


Название: Re: Непонятный глюк со слотами
Отправлено: FreePascal от Август 08, 2010, 10:53
смешно просто, и угораздило же такое написать.
теперь же и понятно почему апликация падает, первый класс вторая четверть.

Большое спасибо.
Вы правы тут не то что moc не причем, тут то и сам QT не при чем.


Название: Re: Непонятный глюк со слотами
Отправлено: SASA от Август 08, 2010, 13:27
Я советую обявлыть данные так
Код:
    QPointer<QLabel> m_label;
    QPointer<QPushButton> m_button;
А использовать так
Код:
if(m_label)
    m_label->setText("fdsfdsfdsf");

Ошибка осталась бы, но приложение не падало.


Название: Re: Непонятный глюк со слотами
Отправлено: alexman от Август 08, 2010, 13:44
Я советую обявлыть данные так
Код:
    QPointer<QLabel> m_label;
    QPointer<QPushButton> m_button;
А использовать так
Код:
if(m_label)
    m_label->setText("fdsfdsfdsf");
Ошибка осталась бы, но приложение не падало.
Зачем лишние проверки, если точно известно, что память выделяется в конструкторе и нигде не удаляется?


Название: Re: Непонятный глюк со слотами
Отправлено: ufna от Август 08, 2010, 17:25
на десктопах обычно незачем, а на том же WinCE - частенько надо, если по-хорошему

хотя обычно не делаю, ибо нагружает излишне - лучше сразу о вопросах памяти думать


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

P.S. И не забывайте про ASEERTы.