LINUX.ORG.RU

[qt][сигналослоты] не видит


0

1

Есть такой код:

...
class MainWindow: public QMainWindow, Ui::MainWindow {

	public:
		MainWindow();
	
	public slots:
		void openUrlSite();
		void openUrlForum();
		void openUrlRegister();
		void openUrlVote();
		void play();

	private:
		void openUrl(QString url);

};

MainWindow::MainWindow() {
	setupUi(this);
	QObject::connect(pushButton_5, SIGNAL(clicked()), this, SLOT(openUrlSite()));
}

void MainWindow::openUrl(QString url) {
	QDesktopServices::openUrl(QUrl(url));
}

void MainWindow::openUrlSite() {
	openUrl(QString::fromUtf8(URL_SITE));
}
...
Ui::MainWindow - сгенерированно qt designer'ом

Компилируется без ошибок, но при попытке выполнения жалуется, что нет такого слота:

Object::connect: No such slot QMainWindow::openUrlSite()
Object::connect:  (sender name:   'pushButton_5')
Object::connect:  (receiver name: 'MainWindow')
Где ошибка?

Ответ на: комментарий от schizoid
main.cpp:(.text.startup+0x14b): undefined reference to `vtable for MainWindow'
main.cpp:(.text.startup+0x154): undefined reference to `vtable for MainWindow'
main.cpp:(.text.startup+0x187): undefined reference to `vtable for MainWindow'
Dragon59 ★★ ()
Ответ на: комментарий от Dragon59

Потому что если программируя на Qt видишь ошибку про vtable, значит нужно сделать qmake.

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

Убедись, что ни один потомок QObject не объявлен в .cpp. Qt (moc, вернее) этого не любит.


Нет, не объявлен.

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

А зачем? Попробовал добавить пустой - ругается ещё и на него

main.o: In function `MainWindow::MainWindow()':
main.cpp:(.text+0x43): undefined reference to `vtable for MainWindow'
main.cpp:(.text+0x4b): undefined reference to `vtable for MainWindow'
main.o: In function `MainWindow::~MainWindow()':
main.cpp:(.text+0xa3): undefined reference to `vtable for MainWindow'
main.cpp:(.text+0xab): undefined reference to `vtable for MainWindow'

Dragon59 ★★ ()

Проблема решилась выносом описания класса, инклюдов и макросов в отдельный заголовочный файл.

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

Проблема решилась выносом описания класса, инклюдов и макросов в отдельный заголовочный файл.

Что требовалось сделать с самого начала.

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

Чума. А сразу нельзя было сказать, что они у тебя в cpp-файле были?

Проблему можно было решить добавление строчки типа

#include "moc_mainwindow.cpp"

и последующим запуском qmake и пересборкой

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

Что-то я завтыкал и даже не подумал, что это всё в одном файле

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

Что требовалось сделать с самого начала.

Иногда все-таки может оказаться удобным вспомогательный класс в cpp запихнуть, хотя тут, конечно, не тот случай.

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

«Без предпосылок к самострелу я плюсокода не люблю» (с)

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

А schizoid'а вы заверяли, что всё так и было изначально.

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

MainWindow(QWidget *parent = 0); если не прокатит, то можно его ещё explicit сделать

как это поможет?

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