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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Segmentation fault и qwt  (Прочитано 12744 раз)
havok
Гость
« : Декабрь 27, 2009, 18:37 »

Помогите, пожалуйста разобраться!
Имею windowXP, Qt 4.6.0, qwt 5.2.0.
А так же программа немного изменённая spectrogram из примеров qwt.
Так вот во время запуска вылетает ошибка:

Приложение остановлено, т.к. оно получило сообщение от операционной системы
Сигнал: SIGSEGV
Назначение: Segmentation fault

Часть кода которая вызывает её следующая:
Код:
 
    QwtPlotZoomer* zoomer = new MyZoomer(canvas());

    zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier);

    zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton);

    QwtPlotPanner *panner = new QwtPlotPanner(canvas());
    panner->setAxisEnabled(QwtPlot::yRight, false);
    panner->setMouseButton(Qt::MidButton);

    // Avoid jumping when labels with more/less digits
    // appear/disappear when scrolling vertically

    const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
    QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
    sd->setMinimumExtent( fm.width("10.0") );

    const QColor c(Qt::darkBlue);
    zoomer->setRubberBandPen(c);
    zoomer->setTrackerPen(c);
А вот как этот класс описан:
Код:
class MyZoomer: public QwtPlotZoomer
{
public:
    MyZoomer(QwtPlotCanvas *canvas):QwtPlotZoomer(canvas)
    {
        setTrackerMode(AlwaysOn);
    }
    virtual QwtText trackerText(const QwtDoublePoint &pos) const
    {
        QColor bg(Qt::white);
        bg.setAlpha(200);
        QwtText text = QwtPlotZoomer::trackerText(pos);
        text.setBackgroundBrush( QBrush( bg ));
        return text;
    }
};
Почти всё сохранено как в примере. Кстати, сам пример тоже не запускается.
P.S. В Linux'е всё работает!
Записан
Dendy
Гость
« Ответ #1 : Декабрь 27, 2009, 18:43 »

Кода явно недостаточно, чтобы проверить у себя. Рекомендация очевидна - запустите под отладчиком и посмотрите где именно крешится.
Записан
havok
Гость
« Ответ #2 : Декабрь 27, 2009, 18:48 »

М... При пошаговом режиме. Он без проблем пробегает ВСЁ. И запускает окно. Спекрограама не закрашена. И потом, при наведении мыши на это окно выдаёт сию ошибку.
Записан
Dendy
Гость
« Ответ #3 : Декабрь 27, 2009, 18:54 »

Я с трудом догадываюсь что это за "оно", и как "оно" выдаёт ошибку. Прикрепите скриншот, что ли.
Записан
havok
Гость
« Ответ #4 : Декабрь 28, 2009, 08:28 »

Я с трудом догадываюсь что это за "оно", и как "оно" выдаёт ошибку. Прикрепите скриншот, что ли.

Появляется окно (первый скрин). Не закрашенная (А в линухе закрашена). Затем при наведении мышкой на Плот Вылетает ошибка (второй скрин)!

Если закоментить часть кода (см первое сообщение), то ошибки не возникает. Но он и ничего не рисует! При пошаговом пробеге, дебагер все строчки кода проходит. Это косяк в операционки походу... во время рисования. В Линуксе с таким же кодом всё работает. Спектрограмму рисует!
« Последнее редактирование: Декабрь 28, 2009, 08:37 от havok » Записан
Dendy
Гость
« Ответ #5 : Декабрь 28, 2009, 11:48 »

Насколько видно из скриншота - Creator остановил программу и можно посмотреть какой поток получил этот сигнал и что там в списке вызовов.
Записан
havok
Гость
« Ответ #6 : Декабрь 28, 2009, 11:53 »

Ээээ... Чего-чего? Улыбающийся
Записан
Dendy
Гость
« Ответ #7 : Декабрь 28, 2009, 11:59 »

Переключаетесь на закладку "Потоки", смотрите все подряд, в каком будет написано, что он получил сигнал SIGSEGV, и слева смотрите в стеке вызовов что именно его повлекло. Таким образом определите, ошибка в вашей программе, Qwt или Qt.
Записан
havok
Гость
« Ответ #8 : Декабрь 28, 2009, 12:47 »

Вкладка поток пуста. Нигде ничего не вижу, что можно посмотреть... Грустный
Вылетает в этой
bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, QEvent *event)
ф-ции, как видно со скринов
« Последнее редактирование: Декабрь 28, 2009, 12:54 от havok » Записан
Dendy
Гость
« Ответ #9 : Декабрь 28, 2009, 14:23 »

Видно у вас Qwt без исходников. И крешится именно в ней. Соберите Qwt сами и перепроверьте ещё раз - должно показать где именно. И багрепорт написать не забудьте.
Записан
havok
Гость
« Ответ #10 : Декабрь 28, 2009, 15:22 »

Нет. С исходниками. Собирал и добавлял qwt как по этой http://www.prog.org.ru/topic_11725_0.html статье... Непонимающий
Записан
ритт
Гость
« Ответ #11 : Декабрь 28, 2009, 15:23 »

ну, QwtPicker и крашит, судя по скрину.
нужно смотреть что он там в ивентФильтре делает...
Записан
havok
Гость
« Ответ #12 : Декабрь 28, 2009, 15:33 »

QwtPicker.cpp
Код:
/*!
  \brief Event filter

  When isEnabled() == true all events of the observed widget are filtered.
  Mouse and keyboard events are translated into widgetMouse- and widgetKey-
  and widgetWheel-events. Paint and Resize events are handled to keep
  rubberband and tracker up to date.

  \sa event(), widgetMousePressEvent(), widgetMouseReleaseEvent(),
      widgetMouseDoubleClickEvent(), widgetMouseMoveEvent(),
      widgetWheelEvent(), widgetKeyPressEvent(), widgetKeyReleaseEvent()
*/
bool QwtPicker::eventFilter(QObject *o, QEvent *e)
{
    if ( o && o == parentWidget() )
    {
        switch(e->type())
        {
            case QEvent::Resize:
            {
                const QResizeEvent *re = (QResizeEvent *)e;
                if ( d_data->resizeMode == Stretch )
                    stretchSelection(re->oldSize(), re->size());

                if ( d_data->rubberBandWidget )
                    d_data->rubberBandWidget->resize(re->size());
            
                if ( d_data->trackerWidget )
                    d_data->trackerWidget->resize(re->size());
                break;
            }
            case QEvent::Leave:
                widgetLeaveEvent(e);
                break;
            case QEvent::MouseButtonPress:
                widgetMousePressEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseButtonRelease:
                widgetMouseReleaseEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseButtonDblClick:
                widgetMouseDoubleClickEvent((QMouseEvent *)e);
                break;
            case QEvent::MouseMove:
                widgetMouseMoveEvent((QMouseEvent *)e);
                break;
            case QEvent::KeyPress:
                widgetKeyPressEvent((QKeyEvent *)e);
                break;
            case QEvent::KeyRelease:
                widgetKeyReleaseEvent((QKeyEvent *)e);
                break;
            case QEvent::Wheel:
                widgetWheelEvent((QWheelEvent *)e);
                break;
            default:
                break;
        }
    }
    return false;
}

А подскажите пожалуйста куда конкретно смотреть! Обеспокоенный
« Последнее редактирование: Декабрь 28, 2009, 15:37 от havok » Записан
Dendy
Гость
« Ответ #13 : Декабрь 28, 2009, 15:40 »

Если местным знатокам интересно - запакуйте программу и прикрепите. Возможно проблема не в Qwt, а в вашем клиентском коде.
Записан
havok
Гость
« Ответ #14 : Декабрь 28, 2009, 15:56 »

Если местным знатокам интересно - запакуйте программу и прикрепите. Возможно проблема не в Qwt, а в вашем клиентском коде.

В Линуксе ведь всё работает...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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