LINUX.ORG.RU

QT connect SLOT


0

0

Помогите! Вроде все правильно сделал. Пишет: Object::connect: No such slot QWidget::SetPointX(int). При чем тут QWidget? Почему он в моем классе не ищет?
class ComplexDraft : public QWidget{
protected:
	virtual void paintEvent(QPaintEvent*);
public:
	ComplexDraft(QWidget* parent);
	Point3d* p;
public slots:
	void SetPointX(int);
};
void ComplexDraft::SetPointX(int x)
{
}
int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QWidget* window = new QWidget(0);
...
	ComplexDraft* cdw = new ComplexDraft(window);
...
	QObject::connect( slidx, SIGNAL( valueChanged(int) ), /*slidy, SLOT( setValue(int) ) ); //*/cdw, SLOT( SetPointX(int) ) );
	window->show();	
	return app.exec();
} 

Замени cdw на this в строке

QObject::connect( slidx, SIGNAL( valueChanged(int) ), /*slidy, SLOT( setValue(int) ) ); //*/cdw, SLOT( SetPointX(int) ) );

Ximen ★★★★
()
Ответ на: комментарий от Ximen

error: invalid use of ‘this’ in non-member function

anonymous
()

а Q_OBJECT в классе ComplexDraft кто будет писать?

ps не забудь после этого сделать qmake

ale ★★
()
Ответ на: комментарий от ale

Сделал
main.o: In function `ComplexDraft::ComplexDraft(QWidget*)':
main.cpp:(.text+0x13e): undefined reference to `vtable for ComplexDraft'
main.cpp:(.text+0x145): undefined reference to `vtable for ComplexDraft'
main.o: In function `ComplexDraft::ComplexDraft(QWidget*)':
main.cpp:(.text+0x1be): undefined reference to `vtable for ComplexDraft'
main.cpp:(.text+0x1c5): undefined reference to `vtable for ComplexDraft'
collect2: ld returned 1 exit status
make: *** [paint] Ошибка 1

anonymous
()
Ответ на: комментарий от anonymous

class ComplexDraft : public QWidget{
	Q_OBJECT

protected:
	virtual void paintEvent(QPaintEvent*);
public:
	ComplexDraft(QWidget* parent);
	Point3d* p;
public slots:
	void SetPointX(int);
};

Все вроде правильно написал. Почему не работает?

anonymous
()
Ответ на: комментарий от anonymous

Afair такое бывает, когда у тебя не определены виртуальные функции, не реализованные в предке. Imho в данном случае это painEvent.

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

paintEvent у меня определен
Я урезал класс до "костей". Надо обязательно писать макрос Q_OBJECT. А компилятор ругается.

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QSlider>

#define SIZE 400

class ComplexDraft : public QWidget{
	Q_OBJECT
public:
	ComplexDraft(QWidget* parent);
public slots:
	void SetPointX(int);
};

ComplexDraft::ComplexDraft(QWidget* parent)
	: QWidget(parent)
{
}

void ComplexDraft::SetPointX(int x)
{
}

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QWidget* window = new QWidget(0);
	QGridLayout *mainbox = new QGridLayout(window);
	QSlider *slidx = new QSlider(Qt::Horizontal, window);
	slidx->setRange(-SIZE,SIZE);
	QSlider *slidy = new QSlider(Qt::Horizontal, window);
	slidy->setRange(-SIZE,SIZE);
	QSlider *slidz = new QSlider(Qt::Horizontal, window);
	slidz->setRange(-SIZE,SIZE);
	ComplexDraft* cdw = new ComplexDraft(window);
	cdw->setMinimumSize(SIZE,SIZE);
	cdw->setMaximumSize(SIZE,SIZE);
	mainbox->addWidget(cdw,0,0,2,2);
	mainbox->addWidget(slidx,2,0,1,4);
	mainbox->addWidget(slidy,3,0,1,4);
	mainbox->addWidget(slidz,4,0,1,4);
	QObject::connect( slidx, SIGNAL( valueChanged(int) ), cdw, SLOT( SetPointX(int) ) );
	window->show();	
	return app.exec();
} 

anonymous
()
Ответ на: комментарий от anonymous

main.o: In function `ComplexDraft::ComplexDraft(QWidget*)':
main.cpp:(.text+0x39): undefined reference to `vtable for ComplexDraft'
main.cpp:(.text+0x40): undefined reference to `vtable for ComplexDraft'
main.o: In function `ComplexDraft::ComplexDraft(QWidget*)':
main.cpp:(.text+0x79): undefined reference to `vtable for ComplexDraft'
main.cpp:(.text+0x80): undefined reference to `vtable for ComplexDraft'
collect2: ld returned 1 exit status
make: *** [paint] Ошибка 1

anonymous
()
Ответ на: комментарий от anonymous

Надо в разных файлах делать описание и реализацию класса, то есть в файлах complexdraft.h , complexdraft.cpp и main.cpp

krum
()
Ответ на: комментарий от YesSSS

>>такое бывает, когда у тебя не определены виртуальные функции, не реализованные в предке

причём тут предки, у него moc не отработал.

2автор

Люди, читайте доки, блин. Как можно это не понимать, когда у вас на руках ТАКАЯ документация ???

Ключевые фразы в assistant:

Using the Meta Object Compiler
Signals and Slots

>>>>>>>>>>>>>>>>>>>>>>

If you get linkage errors in the final building phase of your program, saying that YourClass::className() is undefined or that YourClass lacks a vtbl, something has been done wrong. Most often, you have forgotten to compile or #include the moc-generated C++ code, or (in the former case) include that object file in the link command.

<<<<<<<<<<<<<<<<<<<<<

+

не помешает
Why doesn't Qt use templates for signals and slots?

alex_custov ★★★★★
()
Ответ на: комментарий от plumbum

Столько камментов и только один по делу. Доки видимо читать никто не умеет. Как уже сказали .h'ник с описанием Q_OBJECT класса надо заmoc'hить, скомпайлить и прилинковать, тогда на vtable ругаться не будет.


То есть надо сделать:
moc ComplexDraft.h > ComplexDraft_moc.cpp
g++ -c ComplexDraft_moc.cpp
g++ -c ComplexDraft_main.cpp
g++ ComplexDraft_main.o ComplexDraft_moc.o

Reset ★★★★★
()
Ответ на: комментарий от anonymous

>>Я урезал класс до "костей". Надо обязательно писать макрос Q_OBJECT. А компилятор ругается.

# moc -o main.moc main.cpp
# echo >> main.cpp
# echo "#include main.moc" >> main.cpp
# make

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

чтобы всё это деелось автоматически нужно разделить объявления и реализацию класса на .h и .cpp файлы, и в .pro файле прописать переменную 'HEADERS',

QMake Concepts в догонку.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Разделил на файлы, подредактировал pro-файл. Заработало. Спасибо alex_custov'у и Reset'у за ответы и остальным за старание. :)

Brodobrey
() автор топика
Ответ на: комментарий от Brodobrey

можно было просто moc файл включить через #include и все б заработало..

s0L
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.