Ошибка сегментации в Qt Designer 4.6 с пользовательским виджетом

У меня была ошибка сегментации при использовании моего нового виджета Qt с Qt Designer 4.6. Проблема возникает при попытке предварительного просмотра нового виджета.

при использовании GDB я обнаружил, что проблема в qdesigner_internal::WidgetFactory::applyStyleToTopLevel:

Программа получила сигнал SIGSEGV, Ошибка сегментации.
qdesigner_internal::WidgetFactory::applyStyleToTopLevel (style=0x0, widget=0x1829df0) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/widgetfactory.cpp:777
777 /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/widgetfactory.cpp: такого файла или каталога нет. в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/widgetfactory.cpp
(gdb) bt
#0  qdesigner_internal::WidgetFactory::applyStyleToTopLevel (style=0x0, widget=0x1829df0) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/widgetfactory.cpp:777
#1  0x00007ffff7475bed в qdesigner_internal::QDesignerFormBuilder::createPreview (fw=, styleName=..., appStyleSheet=..., deviceProfile=, scriptErrors=
    0x7fffffffbee0, errorMessage=0x7fffffffc3f0) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/qdesigner_formbuilder.c 404
#2  0x00007ffff7476773 в qdesigner_internal::QDesignerFormBuilder::createPreview (fw=0x0, styleName=..., appStyleSheet=..., deviceProfile=..., errorMessage=0x0) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/qdesigner_formbuilder.cpp:439
#3  0x00007ffff7532b27 в qdesigner_internal::PreviewManager::createPreview (this=0x837f20, fw=0x1879200, pc=..., deviceProfileIndex=-1, errorMessage=0x7fffffffc3f0, initialZoom=-1) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/previewmanager.cpp:686
#4  0x00007ffff75343cf в qdesigner_internal::PreviewManager::showPreview (this=0x837f20, fw=0x1879200, pc=..., deviceProfileIndex=-1 0x0fffess0 = 0c0ff7f07f6f07f07f07f07f07f07f07f07f07f0f7f07f07f07f07f07f07f07f07f07f07f07f0f0f7f07f07f07f07f0f07f07f07f07f07f07f0f07f07f007f07f07f07f07f07f07f07f07f0f7f07f07f00f6f07f00f07f00f07f00f07f000f6f07f7) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/previewmanager.cpp:760
#5  0x00007ffff753472f в qdesigner_internal::PreviewManager::showPreview (this=0x837f20, fw=0x1879200, style=..., deviceProfileIndex=-1, errorMessage=0x7fffffffc3f0) в /var/tmp/qt-x11-src-4.6.0/tools/designer/src/lib/shared/previewmanager.cpp:659

потому что там был передан нулевой указатель:


void WidgetFactory::applyStyleToTopLevel(QStyle *style, QWidget *widget)
{
    const QPalette standardPalette = style->standardPalette();
    if (widget->style() == style && widget->palette() == standardPalette)
        return;
//....
}

Я новичок в Qt, и это мой первый пользовательский виджет. Кто-нибудь есть ключ к решению этой проблемы.

вот мой код виджета


MBICInput::MBICInput(QWidget *parent) : QStackedWidget(parent){
  displayPage = new QWidget();
  displayPage->setObjectName(QString::fromUtf8("displayPage"));

  inputLB = new QLabel(displayPage);
  inputLB->setObjectName(QString::fromUtf8("inputLabel"));
  inputLB->setCursor(QCursor(Qt::PointingHandCursor));

  addWidget(displayPage);

  EditPage = new QWidget();
  EditPage->setProperty("EditInputLine", QVariant(true));
  EditPage->setObjectName(QString::fromUtf8("EditPage"));

  inputInput = new QLineEdit(EditPage);
  inputInput->setGeometry(QRect(5, 10, 231, 25));
  inputInput->setObjectName(QString::fromUtf8("input"));

  addWidget(EditPage);

  _animation = new QString("");
  _message   = new QString("Message");
  _validator = new QRegExpValidator(QRegExp("[a-zA-Z]+"), this);

}

MBICInput::~MBICInput() {
}

QValidator::State MBICInput::validate(QString &text, int &pos) const{
    return _validator->validate(text, pos);
}

void MBICInput::paintEvent(QPaintEvent *) {
  QPainter painter(this);
  painter.setRenderHint(QPainter::Antialiasing);
}


QSize MBICInput::minimumSizeHint() const{
   return QSize(200, 40);
}

QSize MBICInput::sizeHint() const{
   return QSize(200, 40);
}

void MBICInput::setAnimation(const QString &animation){
  *_animation = animation;
  update();
}

QString MBICInput::animation() const{
   return *_animation;
}

void MBICInput::setMessage(const QString &message){
  *_message = message;
  update();
}

QString MBICInput::message() const{
   return *_message;
}

void MBICInput::mousePressEvent(QMouseEvent *event){
  if(currentIndex()==0){
    setCurrentIndex(1);
  }else{
    setCurrentIndex(0);
  }
   update();
}

2 ответа

Просто для информации я просто скомпилировал тот же код под Qt версии 4.5.3-9, и он отлично работал с дизайнером 4.5. может быть, это ошибка Qt 4.6...

В applyStyleToTopLevel функция, вы используете указатели виджета без проверки, что это действительный указатель. Так что при выполнении widget->style с NULL указатель виджета будет сбой.

Другие вопросы по тегам