Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: White Owl от Май 16, 2008, 22:28



Название: странный глюк со StatusBar
Отправлено: White Owl от Май 16, 2008, 22:28
Требуются телепаты.
У меня имеется:
Код:
class MainWindow: public QMainWindow;
из его конструктора точно по учебнику создается начальный статус бар. Потом из другого класса (потомка QWidget) пытаюсь поменять текст на статусбаре:
Код:
void mywidget::readTable(QString tableName) {
    mainWindow->statusBar()->showMessage("Starting to read "+tableName);
    /// собственно само чтение
    /// и завершающее сообещение:
    mainWindow->statusBar()->showMessage("Ready");
}
Проблема в том, что на втором обращении к статусбару я получаю GPF.
Куда копать?

PS QT 4.3.4


Название: Re: странный глюк со StatusBar
Отправлено: lit-uriy от Май 16, 2008, 22:49
что такое GPF?


Название: Re: странный глюк со StatusBar
Отправлено: White Owl от Май 16, 2008, 22:56
General Protection Fault - чтение чужой памяти.


Название: Re: странный глюк со StatusBar
Отправлено: Вячеслав от Май 16, 2008, 23:00
1) для начала погядеть куды кажет mainWindow (на нормальный объект или куда-нибудь еще)
2) тож -самое для statusbar()
3) если все нормально - закоментить все между первым и вторым вызовом.Если работает - "ЫЩЫ ЛЯП" , если нет - полный код в студию ;)

PS GPF это SegFault он-же AV он-же exception 13 ? ;) General protection fault ;)


Название: Re: странный глюк со StatusBar
Отправлено: Вячеслав от Май 16, 2008, 23:03
General Protection Fault - чтение чужой памяти.

Эта .... не надо неправильных высказаваний - не чужой , а "недоступной\не разрешеной" - ее или вообще нет -неверный указатель или нет прав для доступа к этой области...


Название: Re: странный глюк со StatusBar
Отправлено: Tonal от Май 17, 2008, 19:50
А отладчик недоступен?


Название: Re: странный глюк со StatusBar
Отправлено: White Owl от Май 19, 2008, 17:55
1) для начала погядеть куды кажет mainWindow (на нормальный объект или куда-нибудь еще)
2) тож -самое для statusbar()
3) если все нормально - закоментить все между первым и вторым вызовом.Если работает - "ЫЩЫ ЛЯП" , если нет - полный код в студию ;)

PS GPF это SegFault он-же AV он-же exception 13 ? ;) General protection fault ;)
1) Точно нормальный. Первый же раз, в начале метода оно же отрабатывает идеально.
2) А вот тут и есть проблема - переписал этот код вот так:
Код:
void mywidget::readTable(QString tableName) {
    mainWindow->statusBar()->showMessage("Starting to read "+tableName); // здесь работает
    // ....
    QStatusBar *sb;
    sb = mainWindow->mainWindow->statusBar();  // здесь не работает - GPF
    sb->showMessage("Ready");
}
А переделал его в:
Код:
void mywidget::readTable(QString tableName) {
    QStatusBar *sb;
    sb = mainWindow->mainWindow->statusBar();
    sb->showMessage("Starting to read "+tableName);
    // ....
    sb->showMessage("Ready");
}
все отработало как надо. Черти-че :(

3) "ЫЩЫ ЛЯП" Увы, уже негде искать. Комментирование всего блока между двумя попытками доступа к статусбару ничего не изменило - как падало на второй попытке взять статусбар так и падает :(


Название: Re: странный глюк со StatusBar
Отправлено: ритт от Май 19, 2008, 18:30
Код:
QStatusBar *QMainWindow::statusBar() const
{
    QStatusBar *statusbar = d_func()->layout->statusBar();
    if (!statusbar) {
QMainWindow *self = const_cast<QMainWindow *>(this);
statusbar = new QStatusBar(self);
        statusbar->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
self->setStatusBar(statusbar);
    }
    return statusbar;
}

void QMainWindow::setStatusBar(QStatusBar *statusbar)
{
    Q_D(QMainWindow);
    if (d->layout->statusBar() && d->layout->statusBar() != statusbar)
        delete d->layout->statusBar();
    d->layout->setStatusBar(statusbar);
}

QLayoutItem *statusbar;
Код:
QStatusBar *QMainWindowLayout::statusBar() const
{ return statusbar ? qobject_cast<QStatusBar *>(statusbar->widget()) : 0; }

void QMainWindowLayout::setStatusBar(QStatusBar *sb)
{
    if (sb)
        addChildWidget(sb);
    delete statusbar;
    statusbar = sb ? new QWidgetItemV2(sb) : 0;
    invalidate();
}

ломаться, как бы, нечему
придётся "ыскать ляп" )


Название: Re: странный глюк со StatusBar
Отправлено: pastor от Май 19, 2008, 20:29
Присоединяюсь к сообщению Tonal.

Цитировать
А отладчик недоступен?


Название: Re: странный глюк со StatusBar
Отправлено: White Owl от Май 19, 2008, 20:54
Присоединяюсь к сообщению Tonal.

Цитировать
А отладчик недоступен?
Неа :) Хотя прийдется наверное gdb поставить....