LINUX.ORG.RU

Помигите с Qt4: Сигналы и Слоты (очень срочно)


0

0

Здравстуйте!

Завтра здавать лабу (крайний срок), а она еще не готова:
Надо в Конструкторе моего виджета, приконнектить клик некой кнопки к Слоту, определенному в этом же классе (виджете), короче, вот код:

class ShennonWidget : public QWidget
{
	private:
		QPushButton *make32;
		QPushButton *make1024;
		QPushButton *expand;
		QPushButton *collapse;
		void deleteTreeItems(QTreeWidgetItem *item);

	public:
		ShennonWidget(QWidget *parent);
		~ShennonWidget();
		void initConnections(ShennonWidget *reciver);

	public slots:
		void makeTree32(float *probability, char *code);
		QTreeWidget *makeTree1024();
		int countValues();
		void expandAll(QTreeWidgetItem *item);
		void collapseAll(QTreeWidgetItem *item);
		QTreeWidgetItem *start;
		QTreeWidget *tree;
}; //Мой виджет.

...

ShennonWidget::ShennonWidget(QWidget *parent)
	: QWidget(parent)
{
	...
	expand = new QPushButton("Expand Tree", this);
	collapse = new QPushButton("Collapse Tree", this);
	...
	connect(expand, SIGNAL(clicked()), reciver, SLOT(expandAll(start)));
	connect(collapse, SIGNAL(clicked()), reciver, SLOT(collapseAll(start)));
	...
} //Конструктор.

...

При исполнении программа выплевывает в консоль следующее:

Object::connect: No such slot QWidget::expandAll(start)
Object::connect: No such slot QWidget::collapseAll(start)

Кнопки соответсятенно не пашут.
Чего она ищет слоты в QWidget, а не в новом ShennonWidget?

Спасибо, буду ОЧЕНЬ благодарен за скорую помощь :) !

Ответ на: комментарий от Pi

Это я в спешко код пэйстил.

Глюк был в том, что я забыл в начале класса Q_OBJECT,
но сейчас что-то новое вылезло блин:

main.o: In function `~ShennonWidget':
/home/fifajan/projects/qt4/main.cpp:35: undefined reference to `vtable for ShennonWidget'
/home/fifajan/projects/qt4/main.cpp:35: undefined reference to `vtable for ShennonWidget'
/home/fifajan/projects/qt4/main.cpp:35: undefined reference to `vtable for ShennonWidget'
/home/fifajan/projects/qt4/main.cpp:35: undefined reference to `vtable for ShennonWidget'
/home/fifajan/projects/qt4/main.cpp:35: undefined reference to `vtable for ShennonWidget'
main.o:/home/fifajan/projects/qt4/main.cpp:35: more undefined references to `vtable for ShennonWidget' follow
collect2: ld returned 1 exit status
make: *** [qt4] Ошибка 1

Что это такое, понятия не имею! Слова vtable у меня в коде нету!
P.S. На код выше походу забивайте, он неправильный ибо всавлен в спешке. (там надо заменить reciver на this)

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

ребилдь весь проект: make clean; make

vtable - виртуальная таблица - ООП на ней вертится, твоя программа тут не при чём. ну и вообще, книгу какую моно было бы прочиать... :)

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

vtable - это таблица виртуальных функций. Нехватает файлов, в которых определены виртуальные/виртуальная функции класса ShennonWidget.

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

чистка (make clean) ничего не дает :(. Виртуальных функций там нет. Этот глюк принесло добавление Q_OBJECT. Если его убрать, все конпилится, и выдает вышеук. эрроры на рантайме.

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

Ладно, когда такие вопросы с гтк, там документация так себе, хотя тоже в последнее время сильно улучщилась, но в qt отличная документция, почему бы не потратить 10 минут на чтение доки по сигналам и ещё 5 на просмотр кода примеров?

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

Ладно, когда такие вопросы с гтк, там документация так себе, хотя тоже в последнее время сильно улучщилась, но в qt отличная документция, почему бы не потратить 10 минут на чтение доки по сигналам и ещё 5 на просмотр кода примеров?

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

Ну тогда либо к окулисту сходите, либо книжку по c++ поситайте:) Ибо тут http://doc.trolltech.com/4.2/signalsandslots.html написано чёрным по белому в примере

Counter a, b;

QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));

Что в SLOT, что в SIGNAL, надо давать в качестве параметра вигнала тип параметра, а не сам параметр, то есть в вашем случае нужно

connect(expand, SIGNAL(clicked()), this, SLOT(expandAll(QTreeWidgetItem *)));

И ещё раз, внимательно читайте документацю и примеры! Ни разу вы не сверялись....

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

да не надо там смотреть, надо просто одному буратино доку почитать.... и сделать ещё раз qmake -makefile && make

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

да не надо там смотреть, надо просто одному буратино доку почитать.... и сделать ещё раз qmake -makefile && make

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

> connect(expand, SIGNAL(clicked()), this, SLOT(expandAll(QTreeWidgetItem *)));

Строки с коннектом сейчас вообще закомментированы, ошибка остается. qmake-qt4 -project && qmake-qt4 && make делал уже 200 раз, столько же и make clean

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

#include <QApplication>
#include <QFont>
#include <QPushButton>
#include <QWidget>
#include <QObject>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <math.h>
#include "shennon.h"

class ShennonWidget : public QWidget
{
	Q_OBJECT

	public:
		ShennonWidget(QWidget *parent = 0);
		~ShennonWidget();
		QTreeWidget *tree;
		QTreeWidgetItem *start;

	public slots:
		void makeTree32(float *probability, char *code);
		//QTreeWidget *makeTree1024();
		int countValues();
		//int collapseAll();
		void expandAll(QTreeWidgetItem *item);
		void collapseAll(QTreeWidgetItem *item);

	private:
		QPushButton *make32;
		QPushButton *make1024;
		QPushButton *expand;
		QPushButton *collapse;
		void deleteTreeItems(QTreeWidgetItem *item);
};

ShennonWidget::~ShennonWidget()
{
	delete make32;
	delete make1024;
	delete expand;
	delete collapse;
	//this->deleteTreeItems(start);
	//delete tree;
}
void ShennonWidget::deleteTreeItems(QTreeWidgetItem *item)
{
	int count = item->childCount();
	for(int i = 0; i< count; i++)
	{
		ShennonWidget::deleteTreeItems(item->child(i));
		delete item->child(i);
	}

}
void ShennonWidget::makeTree32(float *probability, char *code)
{
	shennon *coder = new shennon(32, probability, code, 32);
	coder->clearCodes();
	coder->sort();
	coder->process(0, 31, 0.5, start);
	delete coder;

}
void ShennonWidget::collapseAll(QTreeWidgetItem *item)
{
	int count = item->childCount();
	for(int i = 0; i< count; i++)
	{
		ShennonWidget::expandAll(item->child(i));
		tree->collapseItem(item->child(i));
	}
}
void ShennonWidget::expandAll(QTreeWidgetItem *item)
{
	int count = item->childCount();
	for(int i = 0; i< count; i++)
	{
		ShennonWidget::expandAll(item->child(i));
		tree->expandItem(item->child(i));
	}
}
ShennonWidget::ShennonWidget(QWidget *parent) : QWidget(parent)
{

	setFixedSize(800, 600);

	//QPushButton *quit = new QPushButton(tr("Quit"), this);
	QStringList labels;
	labels << "New Bit" << "Full Value" << "Probability";
	tree = new QTreeWidget(this);
	start = new QTreeWidgetItem(tree);
	start->setText(0, "Process tree");

	tree->setHeaderLabels(labels);
	tree->setColumnCount(3);
	tree->setGeometry(5, 5, 650, 590);
	make32 = new QPushButton("Make Tree32", this);
	make32->setGeometry(660, 5, 135, 30);
	make1024 = new QPushButton("Make Tree1024", this);
	make1024->setGeometry(660, 40, 135, 30);
	expand = new QPushButton("Expand Tree", this);
	expand->setGeometry(660, 75, 135, 30);
	connect(expand, SIGNAL(clicked()), this, SLOT(expandAll(start)));
	collapse = new QPushButton("Collapse Tree", this);
	collapse->setGeometry(660, 110, 135, 30);
	connect(expand, SIGNAL(clicked()), this, SLOT(expandAll(start)));

}

int main(int argc, char *argv[])
{
	float probability[32]= 
	{
		0.0166, 0.0379, 0.0014, 
		0.0212, 0.0486, 0.0499, 
		0.0558, 0.0347, 0.0505, 
		0.0170, 0.0274, 0.0102, 
		0.0147, 0.0140, 0.0256, 
		0.0544, 0.0197, 0.0439, 
		0.0539, 0.0501, 0.0344, 
		0.0444, 0.0173, 0.0028, 
		0.0475, 0.0448, 0.0036, 
		0.0373, 0.0458, 0.0385, 
		0.0234, 0.0127 
	};
	char code[32][32];
	float probability1024[1024];
	char code1024[1024][32];

	QApplication app(argc, argv);
	ShennonWidget widget;
	widget.show();
	widget.makeTree32(&probability[0], &code[0][0]) ;
	widget.expandAll(widget.start) ;
	return app.exec();
}

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

Только комменты по теме пожалуйста!

Сейчас главное заставить лабу работать. То что там сейчас полно утечек памяти и других некрасивых вещей я знаю.

Спасибо!

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

Так, буратино (я) почитал доку :). Походу чтоб moc все корректно сделал надо вынести описание класса в хидер, ща попробуем.

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

Все закомпилилось и работат, всем спасибо за науку!

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

нужно чтобы файлы с Q_OBJECT были в HEADERS секции .pro файла

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