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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: странный глюк со StatusBar  (Прочитано 8801 раз)
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
« Последнее редактирование: Май 16, 2008, 22:57 от White Owl » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Май 16, 2008, 22:49 »

что такое GPF?
Записан

Юра.
White Owl
Гость
« Ответ #2 : Май 16, 2008, 22:56 »

General Protection Fault - чтение чужой памяти.
Записан
Вячеслав
Гость
« Ответ #3 : Май 16, 2008, 23:00 »

1) для начала погядеть куды кажет mainWindow (на нормальный объект или куда-нибудь еще)
2) тож -самое для statusbar()
3) если все нормально - закоментить все между первым и вторым вызовом.Если работает - "ЫЩЫ ЛЯП" , если нет - полный код в студию Подмигивающий

PS GPF это SegFault он-же AV он-же exception 13 ? Подмигивающий General protection fault Подмигивающий
« Последнее редактирование: Май 16, 2008, 23:04 от Вячеслав » Записан
Вячеслав
Гость
« Ответ #4 : Май 16, 2008, 23:03 »

General Protection Fault - чтение чужой памяти.

Эта .... не надо неправильных высказаваний - не чужой , а "недоступной\не разрешеной" - ее или вообще нет -неверный указатель или нет прав для доступа к этой области...
Записан
Tonal
Гость
« Ответ #5 : Май 17, 2008, 19:50 »

А отладчик недоступен?
Записан
White Owl
Гость
« Ответ #6 : Май 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) "ЫЩЫ ЛЯП" Увы, уже негде искать. Комментирование всего блока между двумя попытками доступа к статусбару ничего не изменило - как падало на второй попытке взять статусбар так и падает Грустный
Записан
ритт
Гость
« Ответ #7 : Май 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();
}

ломаться, как бы, нечему
придётся "ыскать ляп" )
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Май 19, 2008, 20:29 »

Присоединяюсь к сообщению Tonal.

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
White Owl
Гость
« Ответ #9 : Май 19, 2008, 20:54 »

Присоединяюсь к сообщению Tonal.

Цитировать
А отладчик недоступен?
Неа Улыбающийся Хотя прийдется наверное gdb поставить....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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