Ошибка сегментации в 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
указатель виджета будет сбой.