2015-05-10 4 views
1

Я создаю приложения с помощью Qt 5 виджетов на Kubuntu с меню, в котором я соединила действие с функцией в моем классе StateMachine:Ошибка: QAction :: срабатывает защищен - не может подключить сигнал

QObject::connect(
    ui->actionOpen, &QAction::triggered, &sm, &StateMachine::open_file); 

Мне жаль, что я не могу поделиться всем кодом здесь, это коммерческий проект.

Это прекрасно работает с g ++ 4.9 на Kubuntu. Теперь я попытался скомпилировать это на openSUSE 13.1, который имеет только g ++ 4.8, и я не мог найти заголовки для Qt 5. Поэтому я просто попытался создать его с Qt 4.8, который доступен там в репозитории по умолчанию. Тогда я получаю эту ошибку:

/usr/include/QtGui/qaction.h: In constructor ‘MainWindow::MainWindow(QWidget*)’: 
/usr/include/QtGui/qaction.h:228:10: error: ‘void QAction::triggered(bool)’ is protected 
    void triggered(bool checked = false); 
     ^
/project/gui/mainwindow.cpp:26:35: error: within this context 
     ui->actionOpen, &QAction::triggered, &sm, &StateMachine::open_file); 
           ^
/project/gui/mainwindow.cpp:26:75: error: no matching function for call to ‘MainWindow::connect(QAction*&, void (QAction::*)(bool), StateMachine*, void (StateMachine::*)())’ 
     ui->actionOpen, &QAction::triggered, &sm, &StateMachine::open_file); 
                     ^
/project/gui/mainwindow.cpp:26:75: note: candidates are: 
In file included from /usr/include/QtCore/QObject:1:0, 
       from /project/gui/AxisState.hpp:9, 
       from /project/gui/projectionview.h:7, 
       from /project/gui/mainwindow.h:5, 
       from /project/gui/mainwindow.cpp:3: 
/usr/include/QtCore/qobject.h:204:17: note: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType) 
    static bool connect(const QObject *sender, const char *signal, 
       ^
/usr/include/QtCore/qobject.h:204:17: note: no known conversion for argument 2 from ‘void (QAction::*)(bool)’ to ‘const char*’ 
/usr/include/QtCore/qobject.h:217:17: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType) 
    static bool connect(const QObject *sender, const QMetaMethod &signal, 
       ^
/usr/include/QtCore/qobject.h:217:17: note: no known conversion for argument 2 from ‘void (QAction::*)(bool)’ to ‘const QMetaMethod&’ 
/usr/include/QtCore/qobject.h:337:13: note: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const 
inline bool QObject::connect(const QObject *asender, const char *asignal, 
      ^
/usr/include/QtCore/qobject.h:337:13: note: no known conversion for argument 2 from ‘void (QAction::*)(bool)’ to ‘const char*’ 
In file included from /usr/include/QtGui/QAction:1:0, 
       from /project/gui/ui_mainwindow.h:13, 
       from /project/gui/mainwindow.cpp:5: 
/usr/include/QtGui/qaction.h:228:10: error: ‘void QAction::triggered(bool)’ is protected 
    void triggered(bool checked = false); 
     ^

Я смотрел в QAction 4.8 documentation и, похоже, triggered(bool) общественный сигнал. Затем я посмотрел в файл /usr/include/QtGui/qaction.h и обнаружил, что она выглядит следующим образом:

protected:                   
    bool event(QEvent *);               
    QAction(QActionPrivate &dd, QObject *parent);         

public Q_SLOTS:                  
#ifdef QT3_SUPPORT                 
    inline QT_MOC_COMPAT void setOn(bool b) { setChecked(b); }      
#endif                    
    void trigger() { activate(Trigger); }           
    void hover() { activate(Hover); }            
    void setChecked(bool);               
    void toggle();                 
    void setEnabled(bool);               
    inline void setDisabled(bool b) { setEnabled(!b); }        
    void setVisible(bool);               

Q_SIGNALS:                   
    void changed();                 
    void triggered(bool checked = false);           
    void hovered();  

Так что в Q_SIGNALS блок, который делает появляются ниже protected блока, но эти сигналы должны быть открытыми.

Как я могу получить эту программу для компиляции?

ответ

1

Похоже, вы используете Qt5 signal slot connection syntax с Qt 4.x. Просто попробуйте использовать синтаксис Qt 4.x подключения:

QObject::connect(ui->actionOpen, SIGNAL(triggered()), &sm, SLOT(open_file()));

+0

Также я думаю, что Q_SIGNALS на самом деле просто "общественность:". – fassl

 Смежные вопросы

  • Нет связанных вопросов^_^