Russian Qt Forum
Ноябрь 01, 2024, 15:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание дочернего окна - сложности с нахождением ошибки  (Прочитано 10279 раз)
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();

}

Записан
Dendy
Гость
« Ответ #1 : Декабрь 24, 2009, 01:27 »

Потеряли где-то mw.cpp, вот и не находит.
Записан
PavelDart
Гость
« Ответ #2 : Декабрь 24, 2009, 12:33 »

Создал вот такой mw.cpp:
Код:
#include <QtGui>
#include "mw.h"
mw::mw(QWidget *parent)

: QDialog(parent)

{
setupUi(this);

}

Приложение собралось - это радует.  Улыбающийся Одно странно - сообщений и предупреждений об ошибке не было, но вторая форма не показывается.  Непонимающий
Записан
Dendy
Гость
« Ответ #3 : Декабрь 24, 2009, 13:25 »

Форма сама не показывается, это вы её в функции main() показываете. Одну показали, другую - нет. Советую вооружиться хорошей книгой по C++.
Записан
PavelDart
Гость
« Ответ #4 : Декабрь 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();

   

Записан
Dendy
Гость
« Ответ #5 : Декабрь 24, 2009, 13:57 »

Обьяснять в чём ошибка, если базовые знания C++ хромают - тратить своё и ваше время. Советую отложить книги по Qt и читать книги по C++, от корки до корки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 24, 2009, 14:19 »

Создал вот такой mw.cpp:
Код:
#include <QtGui>
#include "mw.h"
mw::mw(QWidget *parent)

: QDialog(parent)

{
setupUi(this);

}

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

Да, виден конструктор класса (с не очень выразительным именем mw  Улыбающийся). Но посоветовать Вам нечего т.к. где и как Вы зовете формы - неизвестно. Выложите компилябельный проект.
Записан
PavelDart
Гость
« Ответ #7 : Декабрь 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. Объекты проекта на пальцах можно пересчитать, по этому - короче название, меньше возможности навернуться с его написанием.  Улыбающийся
Записан
BRE
Гость
« Ответ #8 : Декабрь 25, 2009, 16:29 »

Хорошо что у тебя в проекте не пару тысяч файлов...  Подмигивающий

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Декабрь 25, 2009, 18:27 »

ага, и ui-***.h лучше в архив не прикладывать. А класть туда ***.ui
Записан

Юра.
PavelDart
Гость
« Ответ #10 : Декабрь 25, 2009, 18:54 »

Хорошо что у тебя в проекте не пару тысяч файлов...  Подмигивающий

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

Для наглядности старался.
Записан
BRE
Гость
« Ответ #11 : Декабрь 25, 2009, 19:08 »

2  PavelDart
Записан
PavelDart
Гость
« Ответ #12 : Декабрь 25, 2009, 19:46 »

2  PavelDart
Большое спасибо!  Улыбающийся
Ещё раз перечитал пример из самоучителя - понял почему был почищен майн.

Спасибо всем кто принял участие в этой теме - Dendy, Igors, BRE и Вам Litkevich Uriy.
Книги - наше всё.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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