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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Соединение сигнала с сокетом.  (Прочитано 17474 раз)
RocketMan
Гость
« : Июнь 30, 2007, 12:00 »

Проблема заключается в следующем:

#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H
#include <QDialog.h>
#include "ui_gotocelldialog.h"
class GoToCellDialog : public QDialog, public Ui::GoToCellDialog
{
    Q_OBJECT
public:
    GoToCellDialog(QWidget *parent = 0);
private slots:
    void on_lineEdit_textChanged();
};
#endif

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QHBoxLayout>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QPushButton>
#include <QtGui/QSpacerItem>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>
#include <QtGui/QRegExpValidator>

#include "gotocelldialog.h"
GoToCellDialog::GoToCellDialog(QWidget *parent)
    : QDialog(parent)
{
    setupUi(this);
    QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
    lineEdit->setValidator(new QRegExpValidator(regExp, this));
    connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
    connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(on_lineEdit_textChanged()));

}
void GoToCellDialog::on_lineEdit_textChanged()
{
    okButton->setEnabled(lineEdit->hasAcceptableInput());
}

//программа из C.plus.plus.GUI.Programming.with.Qt.4
в таком виде не линкуется
без Q_OBJECT (т.е. если закомментировать) линкуется, но     connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(on_lineEdit_textChanged())) не работает

Использовал qt 4.1.4 и code::blocks 1.0
Записан
Alex Forth
Гость
« Ответ #1 : Июнь 30, 2007, 12:40 »

Все телепаты в отпуске. Приведи вывод линкера.
Записан
vaprele07
Гость
« Ответ #2 : Июнь 30, 2007, 12:48 »

не генерируется moc_gotocelldialog.cpp возможно нет правил для его сборки, как ты Makefile с генерировал?
Записан
RocketMan
Гость
« Ответ #3 : Июнь 30, 2007, 13:30 »

Project   : QT Application
Compiler  : GNU GCC Compiler (called directly)
Directory : D:\_Programming\QT\GC\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.cpp
Compiling: gotocelldialog.cpp
Linking executable: D:\_Programming\QT\GC\QTapp.exe
.objs\gotocelldialog.o:gotocelldialog.cpp:(.text+0x180): undefined reference to `vtable for GoToCellDialog'
.objs\gotocelldialog.o:gotocelldialog.cpp:(.text+0x18c): undefined reference to `vtable for GoToCellDialog'
.objs\gotocelldialog.o:gotocelldialog.cpp:(.text+0x470): undefined reference to `vtable for GoToCellDialog'
.objs\gotocelldialog.o:gotocelldialog.cpp:(.text+0x47c): undefined reference to `vtable for GoToCellDialog'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 7 seconds)

Я ничего вручную не генерировал, F9 в code::blocks нажал и все.
На всякий случай: программирую под WinXP.
P.S. Только ногами не пиннайте, я второй день в qt ковыряюсь.
Записан
Alex Forth
Гость
« Ответ #4 : Июнь 30, 2007, 13:59 »

1)Q_OBJECT тебе нужен по любому
2) В приведенном выводе не виден список всех обьектных файлов, которые участвуют в сборке. vaprele07 прав - тут обязательно нужен moc_gotocelldialog.cpp. Он генерится автоматом. Проверь, есть ли он у тебя в папке проекта? Участвует ли moc_gotocelldialog.о в линковке?
Записан
RocketMan
Гость
« Ответ #5 : Июнь 30, 2007, 14:53 »

Цитата: "Alex Forth"
1)Q_OBJECT тебе нужен по любому
2) В приведенном выводе не виден список всех обьектных файлов, которые участвуют в сборке. vaprele07 прав - тут обязательно нужен moc_gotocelldialog.cpp. Он генерится автоматом. Проверь, есть ли он у тебя в папке проекта? Участвует ли moc_gotocelldialog.о в линковке?


Что такое moc_gotocelldialog.cpp и moc_gotocelldialog.о, для чего они нужны? gotocelldialog.o нашел в папке .objs, ничего больше.
Записан
Alex Forth
Гость
« Ответ #6 : Июнь 30, 2007, 14:59 »

Для каждого класса, который является наследником от QObject, Qt с помощю специальной утилитки создает еще один так называемый мета-класс.
Подробнее смотри в асистенте. Там есть Overwiev Meta-Object System
Записан
RocketMan
Гость
« Ответ #7 : Июнь 30, 2007, 18:22 »

Проблема в том, что moc_gotocelldialog.о автоматом не генерится.
Если я генерирую его вручную, то результат аналогичен.

Это я нашел собственно в файле:
#error "The header file 'gotocelldialog.h' doesn't include <QObject>."

А можно для меня, ламера, осветить весь процесс сборки подобной программы? А то я без примера это туговато понимаю.
Записан
Alex Forth
Гость
« Ответ #8 : Июнь 30, 2007, 18:30 »

Вручную ни moc_gotocelldialog.о ни moc_gotocelldialog.срр генерить не надо! Улыбающийся
Если у тебя прописанны все пути то можно быстренько все собрать из командной строки. Деалется это так:
1)В папке с исходниками выполняем qmake -project. Это команда создаст файлик с расширением pro. В нем хранятся все настройки твоего проекта. Можешь его посмотреть и если чего не понравится - подправить.
2)Там же выполняем qmake. Эта команда создаст Makefile
3)mingw32-make запускает процесс сборки.
Записан
RocketMan
Гость
« Ответ #9 : Июнь 30, 2007, 19:35 »

Цитата: "Alex Forth"
Вручную ни moc_gotocelldialog.о ни moc_gotocelldialog.срр генерить не надо! Улыбающийся
Если у тебя прописанны все пути то можно быстренько все собрать из командной строки. Деалется это так:
1)В папке с исходниками выполняем qmake -project. Это команда создаст файлик с расширением pro. В нем хранятся все настройки твоего проекта. Можешь его посмотреть и если чего не понравится - подправить.
2)Там же выполняем qmake. Эта команда создаст Makefile
3)mingw32-make запускает процесс сборки.


mingw32-make ничего не делает.
Вот вывод:
D:\_Programming\QT\GC>mingw32-make.exe
mingw32-make.exe: *** No rule to make target `..\..\..=ProgrammingQt=\Qt\4.1.4\m
kspecs\win32-g++\qmake.conf', needed by `makefile'.  Stop.

D:\_Programming\QT\GC>pause
Для продолжения нажмите любую клавишу . . .
Записан
Alex Forth
Гость
« Ответ #10 : Июнь 30, 2007, 19:44 »

Давай по порядку.
После выполнения пунктов 1 и 2 в рабочем каталоге присутствуют файлы *.pro, Makefile, Makefile.Release, Makefile.Debug ?
Записан
Klaustrofob
Гость
« Ответ #11 : Июнь 30, 2007, 19:45 »

У меня такую шнягу пишет, если в названии папки с проектом есть пробелы.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #12 : Июнь 30, 2007, 19:53 »

Цитировать

connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(on_lineEdit_textChanged()));

Этот коннест вообще не нужен, так как у тебя есть слот по имени on_lineEdit_textChanged(), только желательно все же on_lineEdit_textChanged(const QString &).

Почему не показан файл проекта, скорее всего в твоем проекте отсутствует
FORMS += gotocelldialog.ui
Записан
RocketMan
Гость
« Ответ #13 : Июнь 30, 2007, 20:19 »

2 Alex Forth

Да.

2 Klaustrofob

Возможно, только не пробелы, а другие запрещенные символы

2 Mikhail

Чет не понял, а при каком сигнале будет вызываться данный слот как тогда определить, если не connect?
Записан
Alex Forth
Гость
« Ответ #14 : Июнь 30, 2007, 20:26 »

Цитата: "RocketMan"
2 Alex Forth

Да.


Вот и гут Улыбающийся
Теперь посмотри в Makefile, как прописан путь к qmake.conf и сравни с реальным путем к этому файлу. У меня, например, в Makefile написанно так: d:\LIB\qt-4.2.2\mkspecs\win32-g++\qmake.conf
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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