2015-10-27 7 views
0

Я использую Qt5, и я создал класс «внешний» со «внутренним» классом. «Внутренний» класс имеет два объекта QComboBox «cb1» и «cb2» как частные переменные.Как обрабатывать сигналы QComboBox во внутренних классах

В принципе, отображаемый текст второго QComboBox, «cb2», зависит от текущего текста первого QComboBox «cb1». Фактически, легко реализовать соединение между этими двумя, используя сигналы и слоты, написав соответствующий слот.

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

Как я могу обрабатывать связь между этими двумя QComboBoxes во внутреннем классе?

Для некоторого кода,

class Outer : public QDialog 
{ 
    Q_OBJECT 
    // private variables; 

    class Inner : public QWidget 
    { 
    QComboBox *cb1, *cb2; 
    // Other variables; 
    public: 
    // Public methods 
    public slots: 
    void setIndex(int i); 
    }; 
    // Other things; 
}; 

Внутренняя реализация

Outer::Inner::Inner() 
{ 
    // Useless things; 
    connect(cb1, SIGNAL(currentIndexChanged(int)), this, SLOT(setIndex(int))); 
} 

Outer::Inner::setIndex(int i) 
{ 
    // Some stuff to retrieve the correct index in cb2; 
} 
+0

Почему вы должны использовать внутренний класс в этом случае? Это действительно необходимо? Вы можете задокументировать это как личное и разучить его! – Robert

+0

На самом деле это QTabWidget с вкладками QWidget как внутренние классы. Я не хочу использовать виджеты вкладки как отдельные классы, потому что я не хочу, чтобы эти вкладки использовались где-то еще. – Patrik

+0

Это Qt4 или Qt5? –

ответ

0

В Qt 5, любой метод может быть подключен к сигналу, будь то помечается как слот или нет, так что вы описываете является не проблемой.

Вы должны использовать современный connect синтаксис, и он будет работать нормально:

connect(cb1, &QComboBox::currentIndexChanged, this, &Outer::Inner::setIndex); 

Конечно, ничего не будет работать правильно: механизм qobject_cast не будет работать, метаданные будут неправильными, и т.д.

Внутренний класс не может быть QObject. Я полностью не вижу смысла. Сделайте его локальным классом в файле .cpp вместо внутреннего класса.

+0

Я просто попробовал синтаксис подключения и получил следующую ошибку: C2664: 'QMetaObject :: Connection QObject :: connect (const QObject *, const char *, const char *, Qt :: ConnectionType) const': не может преобразовать аргумент 2 из 'overloaded-function' to 'const char *' Контекст не допускает переоценки перегруженной функции – Patrik

+0

Внутренние классы отлично работают как QObjects. Не могли бы вы объяснить, почему вы не рекомендуете такое использование, – Patrik

+0

@Patrik. Они не работают нормально, потому что вы не можете добавить к ним макрос 'Q_OBJECT'. И без этого макроса у вас нет действительного экземпляра 'QObject'. Вам вообще не нужен внутренний класс. Шутки в сторону. Просто удалите его и сделайте его автономным классом в файле '.cpp'. Конечно, вам придется «#include» foo.moc «' в конце файла 'foo.cpp' (например). –

0

Из вашего кода у меня нет причин, по которым вам нужен внутренний класс вообще.

Если вы просто хотите избежать возможности использовать класс в другом месте, я бы порекомендовал его помещать в анонимное пространство имен.

namespace { 
class YourAnonymousClass{ 
... 
} 
} 

class TheOtherClass { 
... 
} 
Смежные вопросы