163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
1

Qt-первая программа

15.08.2011, 23:32. Показов 4171. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я начал изучать Qt4 и первую прогу(диалоговое окно поиска) списал из учебника Бланшет. Но она не компилится)

вот модуль find.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifndef DIALOG_H
#define DIALOG_H
#include <qdialog.h>
#include <QtGui>
 
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
 
class FindDialog : public QDialog
{
    Q_OBJECT
 public: 
    FindDialog(QWidget* parent=0);
 signals: 
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrev(const QString &str, Qt::CaseSensitivity cs);
 private slots:
    void findClicked();
    void enableFindButton(const QString &text);//!!!
 private:
    QLabel* label;
    QLineEdit* lineEdit;
    QCheckBox* caseCheckBox;
    QCheckBox* backwardCheckBox;
    QPushButton* findButton;
    QPushButton* closeButton;
};
 
FindDialog::FindDialog(QWidget* parent) : QDialog(parent)
{
    label = new QLabel(tr("fond &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);
    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("search backward"));
    findButton = new QPushButton(tr("&find"));
    
    findButton->setDefault(true);
    findButton->setEnabled(false);
 
    closeButton = new QPushButton(tr("&quit"));
 
    connect (lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(enableFindButton(const QString &)));//!!
    connect (findButton,SIGNAL(clicked()),this,SLOT(findClicked()));
    connect (closeButton,SIGNAL(clicked()),this,SLOT(close()));
 
    QHBoxLayout* topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);
    
    QVBoxLayout* leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);
    
    QVBoxLayout* rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();
    
    QHBoxLayout* mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);
    
    setWindowTitle("OLOLo FIND!!!");
    setFixedHeight(sizeHint().height()); 
        
}
 
 
void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive
                         : Qt::CaseInsensitive; 
if (backwardCheckBox->isChecked()){
    emit findPrev(text,cs);}  
else {  emit findNext(text,cs);}
}
 
void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}
 
#endif
вот dialog.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include <QtGui>
#include "dialog.h"
 
 
int main (int argc, char** argv)
{
    QApplication app(argc,argv);
    FindDialog* dialog = new FindDialog;
    dialog->show();
    return app.exec();
}
вот сообщения компилятора:

moc_dialog.o: In function `FindDialog::enableFindButton(QString const&)':
moc_dialog.cpp: (.text+0x100): multiple definition of `FindDialog::enableFindButton(QString const&)'
dialog.o:dialog.cpp: (.text+0x0): first defined here
moc_dialog.o: In function `FindDialog::findClicked()':
moc_dialog.cpp: (.text+0x130): multiple definition of `FindDialog::findClicked()'
dialog.o:dialog.cpp: (.text+0x30): first defined here
moc_dialog.o: In function `FindDialog::FindDialog(QWidget*)':
moc_dialog.cpp: (.text+0x2b0): multiple definition of `FindDialog::FindDialog(QWidget*)'
dialog.o:dialog.cpp: (.text+0xe0): first defined here
moc_dialog.o: In function `FindDialog::FindDialog(QWidget*)':
moc_dialog.cpp: (.text+0x890): multiple definition of `FindDialog::FindDialog(QWidget*)'
dialog.o:dialog.cpp: (.text+0x770): first defined here
collect2: ld returned 1 exit status
make: *** [dialog] Ошибка 1

Что у меня не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2011, 23:32
Ответы с готовыми решениями:

Первая программа. Код не компилируется и не запускается программа.
Первая программа, первая ошибка Здравствуйте! Решил учить С++. Скачал книгу Programming:...

Первая программа С++
Вобщем, начал изучать С++, переписываю пример из книги, и в каждой строке ошибку находит (( ну...

Первая программа
Помогите разобраться. Решил написать маленькую программку на Java она не работает. Что то не...

Первая программа
Здравствуйте. Начал учить Assembler, написал первую программу: mov ax, 8 mov cx, 6 ...

13
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.08.2011, 00:04 2
у вас случайно нет там dialog.cpp? Если нет - вынесите туда тела функций и перекомпилируйте проект
0
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
16.08.2011, 00:54  [ТС] 3
Если в одном файле, то вот такие сообщения:

dialog.o: In function `FindDialog::findClicked()':
dialog.cpp: (.text+0x80): undefined reference to `FindDialog::findPrev(QString const&, Qt::CaseSensitivity)'
dialog.cpp: (.text+0xbc): undefined reference to `FindDialog::findNext(QString const&, Qt::CaseSensitivity)'
dialog.o: In function `FindDialog::FindDialog(QWidget*)':
dialog.cpp: (.text+0x10e): undefined reference to `vtable for FindDialog'
dialog.cpp: (.text+0x115): undefined reference to `vtable for FindDialog'
dialog.cpp: (.text+0x12d): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x1c7): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x223): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x27f): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x301): undefined reference to `FindDialog::staticMetaObject'
dialog.o: In function `FindDialog::FindDialog(QWidget*)':
dialog.cpp: (.text+0x79e): undefined reference to `vtable for FindDialog'
dialog.cpp: (.text+0x7a5): undefined reference to `vtable for FindDialog'
dialog.cpp: (.text+0x7bd): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x857): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x8b3): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x90f): undefined reference to `FindDialog::staticMetaObject'
dialog.cpp: (.text+0x991): undefined reference to `FindDialog::staticMetaObject'
collect2: ld returned 1 exit status

Да, и эти сообщения поступают от moc компилятора, gcc обрабатывает все без ошибок
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.08.2011, 01:03 4
причем dialog.cpp ? по тому что вы привели там 11 строчек
0
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
16.08.2011, 01:09  [ТС] 5
в dialod.h просто описывается класс FindDialog.
dialog.cpp основной файл программы.
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
16.08.2011, 01:21 6
скопируй код полносью из примера. прям досконально.
если не получится - думать о работоспособности компилятора
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.08.2011, 01:32 7
компилятор виноват в последнюю очередь
в двух файлах непонятно зачем повторяются описании методов
0
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
16.08.2011, 01:48  [ТС] 8
Программа дословно из книги.

Alex, где у меня повторяется описание методов? Я не понимаю. Компилятор вроде бы на это и ругается "multiple definition".
0
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
16.08.2011, 12:04 9
очень странно: модуль find.h, а подключаешь в main.cpp "dialog.h"

Добавлено через 23 минуты
я походу понял в чем ошибка. у меня тоже выдает такие ошибки. Для лечения надо сделать за правило разделять определение от реализации. У меня все работает, если определение класса и определение класса в разных файлах лежат.

во-вторых, нужно писать не qdialog.h, а QDialog. В Qt обычно заголовки имеют такие же названия, что и соответствующие классы

в-третьих приводу код, который должен работать

finddialog.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
 
#include <QDialog>
 
// Предварительные объявления классов Qt
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
 
class finddialog : public QDialog
{
    Q_OBJECT
public:
    explicit finddialog(QWidget *parent = 0);
 
signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs);
    void findPrev(const QString &str, Qt::CaseSensitivity cs);
 
private slots:
    void findClicked();
    void enableFindButton(const QString &text);
 
private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};
 
#endif // FINDDIALOG_H
finddialog.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "finddialog.h"
#include <QtGui>
 
finddialog::finddialog(QWidget *parent) :
    QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);
 
    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("Search backward"));
 
    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);
    findButton->setEnabled(false);
 
    closeButton = new QPushButton(tr("Close"));
 
    connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &)));
    connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
    connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
 
    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);
 
    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);
 
    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();
 
    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);
 
    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());
}
 
void finddialog::findClicked() {
    QString text = lineEdit->text();
    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
 
    if (backwardCheckBox->isChecked()) {
        emit findPrev(text, cs);
    } else {
        emit findNext(text, cs);
    }
}
 
void finddialog::enableFindButton(const QString &text) {
    findButton->setEnabled(!text.isEmpty());
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include <QApplication>
 
#include "finddialog.h"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    FindDialog *dialog = new FindDialog;
    dialog->show();
    return app.exec();
}
Плюс к тому макросы
#ifndef NAME_HEADER_H
#define NAME_HEADER_H

#endif

предназначены как раз для предотвращения многократного подключения модулей
1
163 / 163 / 22
Регистрация: 23.02.2011
Сообщений: 347
17.08.2011, 16:30  [ТС] 10
TheAthlete спасибо, теперь все хорошо
0
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
17.08.2011, 21:46 11
Всегда пожайлуста, обращайся
0
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 10
20.10.2011, 14:44 12
Прошу помочь. Qt 4.7.4 Qt Creator 2.3.1

На форме кнопка поиска, функция поиска такая же как в этой теме.

C++
1
2
3
4
5
void MainWindow::on_search_clicked()
{
    finddialog *dialog = new finddialog(this);
    dialog->exec();
}
При компиляции получаю: debug/mainwindow.o:C:\Qt\untitled2-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________/../untitled2/mainwindow.cpp:22: undefined reference to `finddialog::finddialog(QWidget*)'

что делать?
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
21.10.2011, 00:34 13
открыть учебник по С/С++ и узнать, что finddialog не тоже самое, что FindDialog. ну и проверить, что хедер с этим классом включен.
0
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 10
21.10.2011, 03:50 14
Цитата Сообщение от Paporotnik Посмотреть сообщение
открыть учебник по С/С++ и узнать, что finddialog не тоже самое, что FindDialog. ну и проверить, что хедер с этим классом включен.
спасибо, я в курсе про эту разницу
подключен он
0
21.10.2011, 03:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2011, 03:50
Помогаю со студенческими работами здесь

Первая программа на c#
хотелось бы посоветоваться с профессионаламию я новичок в C# насколько правильно написан код ?...

Первая программа
Решил выучить основы ассемблера. Скачал себе TASM. Сразу прочитал пару статей об первой праграмме...

первая программа на C++
&quot;#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main () { cout &lt;&lt;...

Первая программа
Всем привет! Вопрос: почему программа не выводит сообщение? Ведь когда открываю езешник открывается...

Первая программа
Здравствуйте форумчане. Только не давно начал изучать delphi(а верней три дня назад D:). Начал...

Первая программа
Только начала изучать PHP и MySQL Не совсем понимаю, почему если у меня создан файл index.php...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru