Название: Создание дочернего окна - сложности с нахождением ошибки
Отправлено: 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. Книги - наше всё.
|