LINUX.ORG.RU

[qt4][.ui] Странная ошибка сегментации


0

0

Здравствуйте!

До сих пор делал формы вручную (кодом), а тут решил православно сделать через qt Designer. Подключаю форму по мануалу, в main(), и вижу segmentation fault. Ошибка происходит на вызов QWidget::setWindowTitle(QApplication::translate(...)) в функции retranslateUi() в сгенеренном дизайнером классе. Пробую в main() перед вызовом Ui::setupUi(widget) принудительно установить windowTitle виджету --- ошибка пропадает.

Понимаю, что проблему решил, но терзают смутные сомнения --- а не загнал ли куда глубже? Поэтому хотелось бы услышать пояснения, почему так происходит.

Заранее благодарен!

★★★★

> Подключаю форму по мануалу, в main()

Какой-то странный мануал. Думаю, все захотят увидеть пример кода.

name_no ★★
()
Ответ на: комментарий от name_no
 #include "ui_MainWidget.h"

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QWidget *widget = new QWidget;

     // Приходится выполнять следующую строку
     widget->setWindowTitle( "text" );

     Ui::CalculatorForm ui;
     ui.setupUi(widget);

     widget->show();
     return app.exec();
 }
Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от name_no

Хм... никакой :) В KDevelop в проект qmake добавил форму, открыл её в qt Designer'е и давай редактировать :) Скорее всего, Dialog without buttons

Подстановка скобочек не помогла :)

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

> Хм... никакой :) В KDevelop в проект qmake добавил форму, открыл её в qt Designer'е и давай редактировать :) Скорее всего, Dialog without buttons

> Подстановка скобочек не помогла :)

Всё понятно, это "Неведомая Гусиная ...ня" ©

Давай уж для полноты картины ui_MainWidget.h...

name_no ★★
()
Ответ на: комментарий от name_no

Ыыыыы... Заметьте, не я это предложил! (с)

/********************************************************************************
** Form generated from reading ui file 'MainWidget.ui'
**
** Created
**      by: Qt User Interface Compiler version 4.5.1
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_MAINWIDGET_H
#define UI_MAINWIDGET_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QFrame>
#include <QtGui/QGridLayout>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QPushButton>
#include <QtGui/QSpacerItem>
#include <QtGui/QTabWidget>
#include <QtGui/QTreeWidget>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWidget
{
public:
    QHBoxLayout *horizontalLayout_4;
    QVBoxLayout *verticalLayout_3;
    QHBoxLayout *horizontalLayout_3;
    QSpacerItem *horizontalSpacer;
    QVBoxLayout *verticalLayout;
    QHBoxLayout *horizontalLayout;
    QFrame *frame;
    QGridLayout *gridLayout_2;
    QLabel *label;
    QFrame *frame_2;
    QGridLayout *gridLayout;
    QLineEdit *surName;
    QHBoxLayout *horizontalLayout_2;
    QFrame *frame_4;
    QGridLayout *gridLayout_3;
    QLabel *label_3;
    QFrame *frame_3;
    QGridLayout *gridLayout_4;
    QLineEdit *numIB;
    QFrame *frame_5;
    QGridLayout *gridLayout_5;
    QPushButton *searchButton;
    QSpacerItem *horizontalSpacer_2;
    QTabWidget *tabWidget;
    QWidget *tab;
    QWidget *tab_5;
    QGridLayout *gridLayout_6;
    QVBoxLayout *verticalLayout_2;
    QLabel *label_2;
    QTreeWidget *treeWidget;
    QWidget *tab_2;
    QWidget *tab_3;
    QWidget *tab_4;

    void setupUi(QWidget *MainWidget)
    {
        if (MainWidget->objectName().isEmpty())
            MainWidget->setObjectName(QString::fromUtf8("MainWidget"));
        MainWidget->resize(739, 492);
        horizontalLayout_4 = new QHBoxLayout(MainWidget);
        horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
        verticalLayout_3 = new QVBoxLayout();
        verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3"));
        horizontalLayout_3 = new QHBoxLayout();
        horizontalLayout_3->setObjectName(QString::fromUtf8("horizontalLayout_3"));
        horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

        horizontalLayout_3->addItem(horizontalSpacer);

        verticalLayout = new QVBoxLayout();
        verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
        horizontalLayout = new QHBoxLayout();
        horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
        frame = new QFrame(MainWidget);
        frame->setObjectName(QString::fromUtf8("frame"));
        QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
        sizePolicy.setHorizontalStretch(0);
        sizePolicy.setVerticalStretch(0);
        sizePolicy.setHeightForWidth(frame->sizePolicy().hasHeightForWidth());
        frame->setSizePolicy(sizePolicy);
        frame->setFrameShape(QFrame::StyledPanel);
        frame->setFrameShadow(QFrame::Raised);
        gridLayout_2 = new QGridLayout(frame);
        gridLayout_2->setObjectName(QString::fromUtf8("gridLayout_2"));
        label = new QLabel(frame);
        label->setObjectName(QString::fromUtf8("label"));
        sizePolicy.setHeightForWidth(label->sizePolicy().hasHeightForWidth());
        label->setSizePolicy(sizePolicy);

        gridLayout_2->addWidget(label, 0, 0, 1, 1);


        horizontalLayout->addWidget(frame);

        frame_2 = new QFrame(MainWidget);
        frame_2->setObjectName(QString::fromUtf8("frame_2"));
        sizePolicy.setHeightForWidth(frame_2->sizePolicy().hasHeightForWidth());
        frame_2->setSizePolicy(sizePolicy);
        frame_2->setFrameShape(QFrame::StyledPanel);
        frame_2->setFrameShadow(QFrame::Raised);
        gridLayout = new QGridLayout(frame_2);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        surName = new QLineEdit(frame_2);
        surName->setObjectName(QString::fromUtf8("surName"));

        gridLayout->addWidget(surName, 0, 0, 1, 1);


        horizontalLayout->addWidget(frame_2);


        verticalLayout->addLayout(horizontalLayout);

        horizontalLayout_2 = new QHBoxLayout();
        horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
        frame_4 = new QFrame(MainWidget);
        frame_4->setObjectName(QString::fromUtf8("frame_4"));
        sizePolicy.setHeightForWidth(frame_4->sizePolicy().hasHeightForWidth());
        frame_4->setSizePolicy(sizePolicy);
        frame_4->setFrameShape(QFrame::StyledPanel);
        frame_4->setFrameShadow(QFrame::Raised);
        gridLayout_3 = new QGridLayout(frame_4);
        gridLayout_3->setObjectName(QString::fromUtf8("gridLayout_3"));
        label_3 = new QLabel(frame_4);
        label_3->setObjectName(QString::fromUtf8("label_3"));
        sizePolicy.setHeightForWidth(label_3->sizePolicy().hasHeightForWidth());
        label_3->setSizePolicy(sizePolicy);

        gridLayout_3->addWidget(label_3, 0, 0, 1, 1);


        horizontalLayout_2->addWidget(frame_4);

        frame_3 = new QFrame(MainWidget);
        frame_3->setObjectName(QString::fromUtf8("frame_3"));
        sizePolicy.setHeightForWidth(frame_3->sizePolicy().hasHeightForWidth());
        frame_3->setSizePolicy(sizePolicy);
        frame_3->setFrameShape(QFrame::StyledPanel);
        frame_3->setFrameShadow(QFrame::Raised);
        gridLayout_4 = new QGridLayout(frame_3);
        gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));
        numIB = new QLineEdit(frame_3);
        numIB->setObjectName(QString::fromUtf8("numIB"));

        gridLayout_4->addWidget(numIB, 0, 0, 1, 1);


        horizontalLayout_2->addWidget(frame_3);

        frame_5 = new QFrame(MainWidget);
        frame_5->setObjectName(QString::fromUtf8("frame_5"));
        frame_5->setFrameShape(QFrame::StyledPanel);
        frame_5->setFrameShadow(QFrame::Raised);
        gridLayout_5 = new QGridLayout(frame_5);
        gridLayout_5->setObjectName(QString::fromUtf8("gridLayout_5"));
        searchButton = new QPushButton(frame_5);
        searchButton->setObjectName(QString::fromUtf8("searchButton"));

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas
        gridLayout_5->addWidget(searchButton, 0, 0, 1, 1);


        horizontalLayout_2->addWidget(frame_5);


        verticalLayout->addLayout(horizontalLayout_2);


        horizontalLayout_3->addLayout(verticalLayout);

        horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

        horizontalLayout_3->addItem(horizontalSpacer_2);


        verticalLayout_3->addLayout(horizontalLayout_3);

        tabWidget = new QTabWidget(MainWidget);
        tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
        tab = new QWidget();
        tab->setObjectName(QString::fromUtf8("tab"));
        tabWidget->addTab(tab, QString());
        tab_5 = new QWidget();
        tab_5->setObjectName(QString::fromUtf8("tab_5"));
        gridLayout_6 = new QGridLayout(tab_5);
        gridLayout_6->setObjectName(QString::fromUtf8("gridLayout_6"));
        verticalLayout_2 = new QVBoxLayout();
        verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
        label_2 = new QLabel(tab_5);
        label_2->setObjectName(QString::fromUtf8("label_2"));

        verticalLayout_2->addWidget(label_2);

        treeWidget = new QTreeWidget(tab_5);
        treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
        treeWidget->setMouseTracking(false);

        verticalLayout_2->addWidget(treeWidget);


        gridLayout_6->addLayout(verticalLayout_2, 0, 0, 1, 1);

        tabWidget->addTab(tab_5, QString());
        tab_2 = new QWidget();
        tab_2->setObjectName(QString::fromUtf8("tab_2"));
        tabWidget->addTab(tab_2, QString());
        tab_3 = new QWidget();
        tab_3->setObjectName(QString::fromUtf8("tab_3"));
        tabWidget->addTab(tab_3, QString());
        tab_4 = new QWidget();
        tab_4->setObjectName(QString::fromUtf8("tab_4"));
        tabWidget->addTab(tab_4, QString());

        verticalLayout_3->addWidget(tabWidget);


        horizontalLayout_4->addLayout(verticalLayout_3);


        retranslateUi(MainWidget);

        tabWidget->setCurrentIndex(1);


        QMetaObject::connectSlotsByName(MainWidget);
    } // setupUi

    void retranslateUi(QWidget *MainWidget)
    {
        MainWidget->setWindowTitle(QApplication::translate("MainWidget", "\320\237\320\265\321\200\321\201\320\276\320\275\320\270\321\204\320\270\321\206\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271 \321\203\321\207\321\221\321\202", 0, QApplication::UnicodeUTF8));
        label->setText(QApplication::translate("MainWidget", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"right\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">\320\244\320\260\320\274\320\270\320\273\320\270\321\217</p></body></html>", 0, QApplication::UnicodeUTF8));

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas
        label_3->setText(QApplication::translate("MainWidget", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"right\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">\342\204\226 \320\270\321\201\321\202\320\276\321\200\320\270\320\270 \320\261\320\276\320\273\320\265\320\267\320\275\320\270</p></body></html>", 0, QApplication::UnicodeUTF8));
        searchButton->setText(QApplication::translate("MainWidget", "\320\235\320\260\320\271\321\202\320\270", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("MainWidget", "\320\237\320\260\321\206\320\270\320\265\320\275\321\202", 0, QApplication::UnicodeUTF8));
        label_2->setText(QApplication::translate("MainWidget", "\320\234\320\265\320\264\320\270\320\272\320\260\320\274\320\265\320\275\321\202\321\213 \320\262 \320\276\321\202\320\264\320\265\320\273\320\265\320\275\320\270\320\270:", 0, QApplication::UnicodeUTF8));
        QTreeWidgetItem *___qtreewidgetitem = treeWidget->headerItem();
        ___qtreewidgetitem->setText(4, QApplication::translate("MainWidget", "\320\235\320\260 \320\277\320\260\321\206\320\270\320\265\320\275\321\202\320\260", 0, QApplication::UnicodeUTF8));
        ___qtreewidgetitem->setText(3, QApplication::translate("MainWidget", "\320\246\320\265\320\275\320\260", 0, QApplication::UnicodeUTF8));
        ___qtreewidgetitem->setText(2, QApplication::translate("MainWidget", "\320\236\321\201\321\202\320\260\321\202\320\276\320\272, \320\265\320\264\320\270\320\275\320\270\321\206", 0, QApplication::UnicodeUTF8));
        ___qtreewidgetitem->setText(1, QApplication::translate("MainWidget", "\320\230\321\201\321\202. \321\204\320\270\320\275\320\260\320\275\321\201.", 0, QApplication::UnicodeUTF8));
        ___qtreewidgetitem->setText(0, QApplication::translate("MainWidget", "\320\235\320\260\320\270\320\274\320\265\320\275\320\276\320\262\320\260\320\275\320\270\320\265", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab_5), QApplication::translate("MainWidget", "\320\222 \320\276\321\202\320\264\320\265\320\273\320\265\320\275\320\270\320\270", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab_2), QApplication::translate("MainWidget", "\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\270", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab_3), QApplication::translate("MainWidget", "\320\230\321\201\321\201\320\273\320\265\320\264\320\276\320\262\320\260\320\275\320\270\321\217", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab_4), QApplication::translate("MainWidget", "\320\230\321\201\321\205\320\276\320\264", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(MainWidget);
    } // retranslateUi

};

namespace Ui {
    class MainWidget: public Ui_MainWidget {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWIDGET_H
Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

> Ыыыыы... Заметьте, не я это предложил! (с)

ну, я ожидал, что это будет сторонний хостинг файлов. В луюбом случае, откуда вот это?

[code] Ui::CalculatorForm ui; ui.setupUi(widget); [/code]

когда в ui-файле нет такого класса? Наконец, могу обрадовать: у меня такая фигня не повторилась. Попробуй make distclean.

name_no ★★
()
Ответ на: комментарий от name_no
namespace Ui {
    class MainWidget: public Ui_MainWidget {};
} // namespace Ui

Это всё сгенеренная uic'ом абстрактная шняга.

У меня qt 4.5.1, не помогло.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от name_no

>Ui::CalculatorForm ui;

А, это я скопипастил в браузер файло из примера. У меня всё нормально с названиями классов, просто там ещё окошко логина дополнительной формой вызывается. Если его закомментить, всё работает точно так же.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от alex_custov

Сейчас пока так, потом мож на tr() переползу. И так мучаюсь с кодировками (FreeTDS не могёт нормлаьно работать с ODBC 3.51, пришлось перекомпилить с поддержкой ODBC 2.0, а там надо извращаться для получения строк в UTF-8).

Но пробовал и с аглицким windowTitle --- сегментэйшн фолт так же.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от alex_custov

В main.cpp комментишь вызов логина (базы-то у тебя нету), и чуть пониже вызов widget->setWindowTitle(...) --- у меня падает

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

чорд, заинтриговали ;)

если проект не секретный, можно ли выложить хотя бы на той же рапидшаре весь архив проекта?

arsi ★★★★★
()
Ответ на: комментарий от Ay49Mihas
int main( int argc, char** argv)
{
        PersonApp app(argc, argv);

        QWidget* widget = new QWidget;

        widget->setWindowTitle( "Person acc" );

        Ui::MainWidget ui;
        ui.setupUi( widget );

        widget->show();

        return app.exec();
}

Работает...

alex_custov ★★★★★
()
Ответ на: комментарий от arsi

>если проект не секретный, можно ли выложить хотя бы на той же рапидшаре весь архив проекта?

Я и выложил весь архив, тока БД нету, к которой коннектится --- это отдельный проект, уже давний.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

-PersonApp( int, char** );
+PersonApp( int &, char** );

Забыл амперсанд.

alex_custov ★★★★★
()

В общем, сейчас поменял форму на вручную формируемую --- и всё отлично работает. Что-то с UI-механизмом намудрили замечательные спецы из Trolltech/Novell.

Ay49Mihas ★★★★
() автор топика
Ответ на: комментарий от Ay49Mihas

> В общем, сейчас поменял форму на вручную формируемую --- и всё отлично работает. Что-то с UI-механизмом намудрили замечательные спецы из Trolltech/Novell.

alex_custov вам верно посоветовал добавить амперсанд в конструктор. если передавать argc как ссылку, то и предыдущий ваш код вполне работоспособен.

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.