Russian Qt Forum

Qt => Общие вопросы => Тема начата: PavelDart от Декабрь 23, 2009, 23:12



Название: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 23, 2009, 23:12
Доброго времени суток.
Собираю простое приложение - появилась ошибка, хотя прописал, как приведено в самоучителе. Сейчас от приложения требуется, чтобы по  нажатию клавиши в окне А открывалось окно Б. Раньше всё это писал в дизайнере на qt3 - работало, сейчас использую 4.5.1 - немного сложнее.

Ошибка такая:

debug/enter.o(.text+0x3f1): In function `ZN5enter27on_all_lineEdit_textChangedEv':
C:/Qt/projects/client/enter.cpp:15: undefined reference to `mw::mw(QWidget*)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\client.exe] Error 1
mingw32-make[1]: Leaving directory `C:/Qt/projects/client'
mingw32-make: *** [debug] Error 2


Обе формы скомпонованы в дизайнере 4.3.4:


из ui_enter.h (первая форма):
Код:
class Ui_enter
{
public:
    QLineEdit *db_name;
    QLineEdit *db_user;
    QLineEdit *db_pass;
    QPushButton *bp;
    QFrame *line;
    QFrame *line_2;
    QFrame *line_3;

    void setupUi(QWidget *enter)
    {
        if (enter->objectName().isEmpty())
            enter->setObjectName(QString::fromUtf8("enter"));
        enter->resize(400, 200);
        enter->setCursor(QCursor(Qt::PointingHandCursor));
        db_name = new QLineEdit(enter);
        db_name->setObjectName(QString::fromUtf8("db_name"));
        db_name->setGeometry(QRect(30, 20, 113, 20));
        db_name->setAutoFillBackground(false);
        db_user = new QLineEdit(enter);
        db_user->setObjectName(QString::fromUtf8("db_user"));
        db_user->setGeometry(QRect(30, 70, 113, 20));
        db_pass = new QLineEdit(enter);
        db_pass->setObjectName(QString::fromUtf8("db_pass"));
        db_pass->setGeometry(QRect(30, 120, 113, 20));
        db_pass->setEchoMode(QLineEdit::Password);
        bp = new QPushButton(enter);
        bp->setObjectName(QString::fromUtf8("bp"));
        bp->setEnabled(true);
        bp->setGeometry(QRect(294, 162, 101, 31));
        line = new QFrame(enter);
        line->setObjectName(QString::fromUtf8("line"));
        line->setGeometry(QRect(10, 40, 271, 16));
        line->setFrameShape(QFrame::HLine);
        line->setFrameShadow(QFrame::Sunken);
        line_2 = new QFrame(enter);
        line_2->setObjectName(QString::fromUtf8("line_2"));
        line_2->setGeometry(QRect(10, 90, 271, 16));
        line_2->setFrameShape(QFrame::HLine);
        line_2->setFrameShadow(QFrame::Sunken);
        line_3 = new QFrame(enter);
        line_3->setObjectName(QString::fromUtf8("line_3"));
        line_3->setGeometry(QRect(10, 140, 271, 16));
        line_3->setFrameShape(QFrame::HLine);
        line_3->setFrameShadow(QFrame::Sunken);

        retranslateUi(enter);

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



из ui_mw.h (вторая форма):
Код:
class Ui_mw
{
public:
    QTabWidget *tabWidget;
    QWidget *tab;
    QWidget *tab_3;

    void setupUi(QWidget *mw)
    {
        if (mw->objectName().isEmpty())
            mw->setObjectName(QString::fromUtf8("mw"));
        mw->resize(460, 346);
        tabWidget = new QTabWidget(mw);
        tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
        tabWidget->setGeometry(QRect(0, 0, 461, 281));
        tab = new QWidget();
        tab->setObjectName(QString::fromUtf8("tab"));
        tabWidget->addTab(tab, QString());
        tab_3 = new QWidget();
        tab_3->setObjectName(QString::fromUtf8("tab_3"));
        tabWidget->addTab(tab_3, QString());

        retranslateUi(mw);

        tabWidget->setCurrentIndex(1);


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



mw.h (заголовочный второй формы):
Код:
#ifndef MW_H
#define MW_H

#include <QDialog>
#include "ui_mw.h"

class mw: public QDialog, public Ui::mw
{
Q_OBJECT

public:
mw(QWidget *parent = 0);
private slots:

};

#endif


ну и реализации первой формы:
Код:
#include <QtGui>
#include "enter.h"
#include "mw.h"
enter::enter(QWidget *parent)

: QDialog(parent)

{
setupUi(this);
connect(bp, SIGNAL(clicked()),this, SLOT(on_all_lineEdit_textChanged()));
}

void enter::on_all_lineEdit_textChanged()
{
mw *dialog = new mw(this);
dialog->show();
close();

}



Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: Dendy от Декабрь 24, 2009, 01:27
Потеряли где-то mw.cpp, вот и не находит.


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 24, 2009, 12:33
Создал вот такой mw.cpp:
Код:
#include <QtGui>
#include "mw.h"
mw::mw(QWidget *parent)

: QDialog(parent)

{
setupUi(this);

}

Приложение собралось - это радует.  :) Одно странно - сообщений и предупреждений об ошибке не было, но вторая форма не показывается.  ???


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: Dendy от Декабрь 24, 2009, 13:25
Форма сама не показывается, это вы её в функции main() показываете. Одну показали, другую - нет. Советую вооружиться хорошей книгой по C++.


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 24, 2009, 13:49
Форма сама не показывается, это вы её в функции main() показываете. Одну показали, другую - нет. Советую вооружиться хорошей книгой по C++.

Dendy, благодарю  Вас за отзывчивость.  Сразу объясню - к помощи форума прибегаю в последнюю очередь.  В основном же изучаю книгу Макса Шлее в переводе BHV и книгу Жасмин Бланшет, ни в одной из них не нахожу ответа на свой простой вопрос.
Можно подробнее про
Цитировать
это вы её в функции main() показываете. Одну показали, другую - нет.

В Ассистанте и такой же в интернете нашёл пример:

Код:
void EditorWindow::find()
 {
     if (!findDialog) {
         findDialog = new FindDialog(this);
         connect(findDialog, SIGNAL(findNext()), this, SLOT(findNext()));
     }

     findDialog->show();
     findDialog->raise();
     findDialog->activateWindow();
 }

применительно к своему приложению написал так:

Код:
	if (!mw)
{
            mw = new QDialog(this);
}
mw->show();
mw->activateWindow();

   



Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: Dendy от Декабрь 24, 2009, 13:57
Обьяснять в чём ошибка, если базовые знания C++ хромают - тратить своё и ваше время. Советую отложить книги по Qt и читать книги по C++, от корки до корки.


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: Igors от Декабрь 24, 2009, 14:19
Создал вот такой mw.cpp:
Код:
#include <QtGui>
#include "mw.h"
mw::mw(QWidget *parent)

: QDialog(parent)

{
setupUi(this);

}

Приложение собралось - это радует.  :) Одно странно - сообщений и предупреждений об ошибке не было, но вторая форма не показывается.  ???

Да, виден конструктор класса (с не очень выразительным именем mw  :)). Но посоветовать Вам нечего т.к. где и как Вы зовете формы - неизвестно. Выложите компилябельный проект.


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 25, 2009, 15:28
Обьяснять в чём ошибка, если базовые знания C++ хромают - тратить своё и ваше время.

Конечно Вы правы - есть что изучать подробно, но краткоt пояснение или ссылка сейчас мне бы не помешалb. Курсовая горит.

Да, виден конструктор класса (с не очень выразительным именем mw  :)). Но посоветовать Вам нечего т.к. где и как Вы зовете формы - неизвестно. Выложите компилябельный проект.

Вот проект, который собирается без ошибок, но опять же, не работает:

Код:
client.pro

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += C:/Qt/projects/client/. .

# Input
HEADERS += enter.h mw.h
FORMS += enter.ui mw.ui
SOURCES += enter.cpp main.cpp mw.cpp

Код:
main.cpp

#include  <QApplication>
#include <QDialog>
#include "ui_enter.h"
#include "ui_mw.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Ui::enter ui;
QDialog *dialog = new QDialog;
ui.setupUi(dialog);
dialog->show();


return app.exec();
}

Код:
ui_enter.h

#ifndef UI_ENTER_H
#define UI_ENTER_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QFrame>
#include <QtGui/QHeaderView>
#include <QtGui/QLineEdit>
#include <QtGui/QPushButton>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_enter
{
public:
    QLineEdit *db_name;
    QLineEdit *db_user;
    QLineEdit *db_pass;
    QPushButton *bp;
    QFrame *line;
    QFrame *line_2;
    QFrame *line_3;

    void setupUi(QWidget *enter)
    {
        if (enter->objectName().isEmpty())
            enter->setObjectName(QString::fromUtf8("enter"));
        enter->resize(400, 200);
        enter->setCursor(QCursor(Qt::PointingHandCursor));
        db_name = new QLineEdit(enter);
        db_name->setObjectName(QString::fromUtf8("db_name"));
        db_name->setGeometry(QRect(30, 20, 113, 20));
        db_name->setAutoFillBackground(false);
        db_user = new QLineEdit(enter);
        db_user->setObjectName(QString::fromUtf8("db_user"));
        db_user->setGeometry(QRect(30, 70, 113, 20));
        db_pass = new QLineEdit(enter);
        db_pass->setObjectName(QString::fromUtf8("db_pass"));
        db_pass->setGeometry(QRect(30, 120, 113, 20));
        db_pass->setEchoMode(QLineEdit::Password);
        bp = new QPushButton(enter);
        bp->setObjectName(QString::fromUtf8("bp"));
        bp->setEnabled(true);
        bp->setGeometry(QRect(294, 162, 101, 31));
        line = new QFrame(enter);
        line->setObjectName(QString::fromUtf8("line"));
        line->setGeometry(QRect(10, 40, 271, 16));
        line->setFrameShape(QFrame::HLine);
        line->setFrameShadow(QFrame::Sunken);
        line_2 = new QFrame(enter);
        line_2->setObjectName(QString::fromUtf8("line_2"));
        line_2->setGeometry(QRect(10, 90, 271, 16));
        line_2->setFrameShape(QFrame::HLine);
        line_2->setFrameShadow(QFrame::Sunken);
        line_3 = new QFrame(enter);
        line_3->setObjectName(QString::fromUtf8("line_3"));
        line_3->setGeometry(QRect(10, 140, 271, 16));
        line_3->setFrameShape(QFrame::HLine);
        line_3->setFrameShadow(QFrame::Sunken);

        retranslateUi(enter);

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

    void retranslateUi(QWidget *enter)
    {
        enter->setWindowTitle(QApplication::translate("enter", "\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217", 0, QApplication::UnicodeUTF8));
        db_name->setText(QApplication::translate("enter", "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\275\320\260\320\267. \320\221\320\224", 0, QApplication::UnicodeUTF8));
        db_user->setText(QApplication::translate("enter", "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\222\320\260\321\210 \320\273\320\276\320\263\320\270\320\275", 0, QApplication::UnicodeUTF8));
        db_pass->setText(QApplication::translate("enter", "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\222\320\260\321\210 \320\277\320\260\321\200\320\276\320\273\321\214", 0, QApplication::UnicodeUTF8));
        bp->setText(QApplication::translate("enter", "\320\222\320\276\320\271\321\202\320\270 >>", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(enter);
    } // retranslateUi

};

namespace Ui {
    class enter: public Ui_enter {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_ENTER_H

Код:
ui_mw.h

#ifndef UI_MW_H
#define UI_MW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QTabWidget>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_mw
{
public:
    QTabWidget *tabWidget;
    QWidget *tab;
    QWidget *tab_3;

    void setupUi(QWidget *mw)
    {
        if (mw->objectName().isEmpty())
            mw->setObjectName(QString::fromUtf8("mw"));
        mw->resize(460, 346);
        tabWidget = new QTabWidget(mw);
        tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
        tabWidget->setGeometry(QRect(0, 0, 461, 281));
        tab = new QWidget();
        tab->setObjectName(QString::fromUtf8("tab"));
        tabWidget->addTab(tab, QString());
        tab_3 = new QWidget();
        tab_3->setObjectName(QString::fromUtf8("tab_3"));
        tabWidget->addTab(tab_3, QString());

        retranslateUi(mw);

        tabWidget->setCurrentIndex(1);


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

    void retranslateUi(QWidget *mw)
    {
        mw->setWindowTitle(QApplication::translate("mw", "\320\223\320\273\320\260\320\262\320\275\320\276\320\265 \320\236\320\272\320\275\320\276", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab), QApplication::translate("mw", "\320\222\320\262\320\276\320\264 \320\224\320\260\320\275\320\275\320\275\321\213\321\205", 0, QApplication::UnicodeUTF8));
        tabWidget->setTabText(tabWidget->indexOf(tab_3), QApplication::translate("mw", "\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200 \320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\260", 0, QApplication::UnicodeUTF8));
        Q_UNUSED(mw);
    } // retranslateUi

};

namespace Ui {
    class mw: public Ui_mw {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MW_H

Код:
enter.h 

#ifndef ENTER_H
#define ENTER_H

#include <QDialog>
#include "ui_enter.h"

class enter: public QDialog, public Ui::enter
{
Q_OBJECT

public:
enter(QWidget *parent = 0);
private slots:
void on_all_lineEdit_textChanged();

};

#endif

Код:
mw.h 

#ifndef MW_H
#define MW_H

#include <QDialog>
#include "ui_mw.h"

class mw: public QDialog, public Ui::mw
{
Q_OBJECT

public:
mw(QWidget *parent = 0);
private slots:

};

#endif

Код:
enter.cpp

#include <QtGui>
#include "enter.h"
#include "mw.h"

enter::enter(QWidget *parent)

: QDialog(parent)

{
setupUi(this);
connect(bp, SIGNAL(clicked()),this, SLOT(on_all_lineEdit_textChanged()));
}

void enter::on_all_lineEdit_textChanged()
{
mw *dialog = new mw(this);
dialog->show();
close();

/* if (!mw)
{
    mw = new QDialog(this); //or QMainWindow, or your custom class
}
mw->show();
mw->activateWindow(); */


}

Код:
mw.cpp

#include <QtGui>
#include "mw.h"
mw::mw(QWidget *parent)

: QDialog(parent)

{
setupUi(this);

}

Вот здесь всё.

Цитировать
с не очень выразительным именем mw
mw - MainWindow. Объекты проекта на пальцах можно пересчитать, по этому - короче название, меньше возможности навернуться с его написанием.  :)


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: BRE от Декабрь 25, 2009, 16:29
Хорошо что у тебя в проекте не пару тысяч файлов...  ;)

Желательно все эти файлы + pro положить в архив и добавить в сообщение. Очень устаешь, когда копи-пастиш прямо с форума.  :)


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: lit-uriy от Декабрь 25, 2009, 18:27
ага, и ui-***.h лучше в архив не прикладывать. А класть туда ***.ui


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 25, 2009, 18:54
Хорошо что у тебя в проекте не пару тысяч файлов...  ;)

Желательно все эти файлы + pro положить в архив и добавить в сообщение. Очень устаешь, когда копи-пастиш прямо с форума.  :)

Для наглядности старался.


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: BRE от Декабрь 25, 2009, 19:08
2  PavelDart


Название: Re: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: PavelDart от Декабрь 25, 2009, 19:46
2  PavelDart
Большое спасибо!  :)
Ещё раз перечитал пример из самоучителя - понял почему был почищен майн.

Спасибо всем кто принял участие в этой теме - Dendy, Igors, BRE и Вам Litkevich Uriy.
Книги - наше всё.