Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] no matching function for QObject::connect()


Автор: kemiisto 17.6.2011, 12:26
Ругается на
Код

connect(&mm_, SIGNAL(geometryChanged()),
              &tab->moleculeEditor(), SLOT(updateGL()));

Код

error: no matching function for call to 'MainWindow::connect(Chemistry::MolecularMechanics*, const char*, Render::MoleculeEditor*, const char*)'

Не нравится ему вторая часть, связанная со слотом. Такое ощущение, что он не считает Render::MoleculeEditor наследником QObject. Но это так. Render::MoleculeEditor <- Render::MoleculeViewer <- QGLViewer <- QGLWidget <- QWidget <- QObject.

Что за %^$#@?

Добавлено через 7 минут и 26 секунд
http://doc.qt.nokia.com/latest/moc.html#multiple-inheritance-requires-qobject-to-be-first
Что значит "virtual inheritance"? И что значит "is not supported"?

Автор: Sartorius 17.6.2011, 12:35
Может явно преобразовать к QObject*?
ЗЫ
А ты и МД движек на Qt пишешь или только редактор?

Автор: kemiisto 17.6.2011, 12:40
Цитата(Sartorius @  17.6.2011,  11:35 Найти цитируемый пост)
А ты и МД движек на Qt пишешь или только редактор?

Только редактор.

Цитата(Sartorius @  17.6.2011,  11:35 Найти цитируемый пост)
Может явно преобразовать к QObject*?

Никогда же не было нужно! Нет, тут что-то другое.

Автор: Sartorius 17.6.2011, 12:46
Цитата(kemiisto @  17.6.2011,  13:26 Найти цитируемый пост)
Virtual inheritance with QObject is not supported.
Что значит "virtual inheritance"? И что значит "is not supported"? 
 
Ромбовидная иерархия где-то. Ты наверно явно пытаешься MoleculeEditor от QObject отнаследовать...

Автор: borisbn 17.6.2011, 12:47
Цитата(kemiisto @  17.6.2011,  12:26 Найти цитируемый пост)
Не нравится ему вторая часть, связанная со слотом

почему так уверенно ?
нет ли у Chemistry::MolecularMechanics и Render::MoleculeEditor множественного наследования ? Если есть, то предок, у которого предок QObject должен быть первым в списке
Код
class A : public MyIFace, public QWidget // <---- НЕПРАВИЛЬНО

Есть ли в h-никах связываемых классов макрос Q_OBJECT ?
Попробуй сделать
Код

QObject * o1 = &mm_;
QObject * o2 = &tab->moleculeEditor();

что говорит ?

Добавлено через 2 минуты и 24 секунды
Цитата(Sartorius @  17.6.2011,  12:46 Найти цитируемый пост)
Цитата(kemiisto @  17.6.2011,  13:26 )Virtual inheritance with QObject is not supported.Что значит "virtual inheritance"? И что значит "is not supported"? 

Sartorius, откуда цитата ???

Автор: kemiisto 17.6.2011, 12:52
Цитата(borisbn @  17.6.2011,  11:47 Найти цитируемый пост)
почему так уверенно ?

Если изменить вторую часть - компилируется.

Цитата(Sartorius @  17.6.2011,  11:46 Найти цитируемый пост)
Ромбовидная иерархия где-то. Ты наверно явно пытаешься MoleculeEditor от QObject отнаследовать...

Нет. Нет у меня такого. Я просто в доке нашёл. Не знал, что это.

Цитата(borisbn @  17.6.2011,  11:47 Найти цитируемый пост)
нет ли у Chemistry::MolecularMechanics и Render::MoleculeEditor множественного наследования ?

Нету. Ну, то есть у QWidget там есть, но там всё правильно.

Цитата(borisbn @  17.6.2011,  11:47 Найти цитируемый пост)
Есть ли в h-никах связываемых классов макрос Q_OBJECT ?

Да есть.

Цитата(borisbn @  17.6.2011,  11:47 Найти цитируемый пост)
что говорит ?

На второй строчке пишет:
Код

error: cannot convert 'Render::MoleculeEditor*' to 'QObject*' in initialization

Автор: Sartorius 17.6.2011, 12:57
Можно еще посмотреть, что moc на выходе дает.  smile

Добавлено через 5 минут и 52 секунды
Да, еще бывает qmake помогает в таких случаях, что б makefile обновился

Автор: kemiisto 17.6.2011, 13:04
Цитата(Sartorius @  17.6.2011,  11:57 Найти цитируемый пост)
Можно еще посмотреть, что moc на выходе дает.

Ничего. Не доходит до moc, ошибка раньше.

Автор: borisbn 17.6.2011, 13:08
Цитата(kemiisto @  17.6.2011,  12:26 Найти цитируемый пост)
Render::MoleculeEditor <- Render::MoleculeViewer <- QGLViewer <- QGLWidget <- QWidget <- QObject.

давай проверим:
Код

Render::MoleculeEditor * o = &tab->moleculeEditor();
Render::MoleculeViewer * parent_1 = o;
QGLViewer * parent_2 = o;
QWidget * parent_3 = o;
QObject * parent_4 = o; // хотя нет, это ужЕ проверяли

Автор: kemiisto 17.6.2011, 13:10
borisbn, я уже проверил. Ничто не работает. Кроме, естественно
Код
Render::MoleculeEditor * o = &tab->moleculeEditor();

Автор: borisbn 17.6.2011, 13:14
Цитата(kemiisto @  17.6.2011,  13:10 Найти цитируемый пост)
я уже проверил. Ничто не работает

значит однозначно © самизнаетекто Render::MoleculeEditor не является наследником Render::MoleculeViewer
выложи кусок (самое начало) описания класса Render::MoleculeEditor

Автор: kemiisto 17.6.2011, 13:20
Цитата(borisbn @  17.6.2011,  12:14 Найти цитируемый пост)
Render::MoleculeEditor не является наследником Render::MoleculeViewer

Ну я же не совсем идиот.
Код

#ifndef RENDER_MOLECULE_EDITOR_H
#define RENDER_MOLECULE_EDITOR_H

#include "Render/RenderMoleculeViewer.h"

namespace Render
{
  class MoleculeEditor : public MoleculeViewer
  {
    Q_OBJECT

  public:
    MoleculeEditor(QWidget* parent = 0);

  public slots:
    void setAtomSymbol(const QString& atomSymbol);
    QString atomSymbol() const;

  private:
    void mouseLeftButtonWithCtrlPressEvent(QMouseEvent* e);
    void mouseLeftButtonWithCtrlReleaseEvent(QMouseEvent* e);
    // added atom atomic number
    int atomicNumber_;
    int atomSelectedBeforeIndex_;
  };
}

#endif // RENDER_MOLECULE_EDITOR_H

Автор: math64 17.6.2011, 13:44
Вставьте #error в заголовок. Если компилятор не будет ругаться на #error, значит заголовок берётся откуда-то из другого места.

Автор: kemiisto 17.6.2011, 13:56
Цитата(math64 @  17.6.2011,  12:44 Найти цитируемый пост)
Вставьте #error в заголовок. Если компилятор не будет ругаться на #error, значит заголовок берётся откуда-то из другого места.

Не ругается. Ну так он и не доходит до файла с исходным кодом, где этот заголовок включен. И брать этот заголовок больше неоткуда.

Автор: bsa 17.6.2011, 15:09
kemiisto, может стоит включить файл в тот cpp, в котором проблемный connect? Подозреваю, что у тебя используются предопределения.

Автор: kemiisto 17.6.2011, 15:32
Цитата(bsa @  17.6.2011,  14:09 Найти цитируемый пост)
kemiisto, может стоит включить файл в тот cpp, в котором проблемный connect? Подозреваю, что у тебя используются предопределения.

Решено. Спасибо. Думал в этом направлении, но счёл идиотизмом. Вообще эта метаобъектная система Qt по информативности сообщений об ошибках даст фору шаблонам. Тьфу!

P.S. Всё больше склоняюсь к идее массовых репрессий С++-программистов. Так сказать принести из в жертву во имя Прогресса.

Автор: EnergoHokum 17.6.2011, 15:33
А этот tab->moleculeEditor() возвращает ссылку на объект класса, наследованного от QObject?

Автор: kemiisto 17.6.2011, 15:35
Цитата(EnergoHokum @  17.6.2011,  14:33 Найти цитируемый пост)
А этот tab->moleculeEditor() возвращает ссылку на объект класса, наследованного от QObject?

Да. smile 

Автор: EnergoHokum 17.6.2011, 15:40
Это я пока набирал сообщение, уже решили проблему, значит. Опоздал к раздаче... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)