2015-08-18 2 views
-1

Я использую создатель QT для создания формы Ui. У меня есть базовая форма, содержащая 5 кнопок (testListForm). Я наследую этот базовый класс в моем производном классе (DisplayTestResultsForm) через TestStatusForm. когда я нажимаю кнопку в производном классе, функция on_pushbutton_1_clicked() получает трижды. ниже фрагмент кодаРазъем кнопки, вызываемый несколько раз с множественным наследованием в QT

class TestListForm : public TestBaseForm 
{ 
    Q_OBJECT 

private slots: 
    virtual void on_pushButton_1_clicked(); 
    virtual void on_pushButton_2_clicked(); 
    virtual void on_pushButton_3_clicked(); 
    virtual void on_pushButton_4_clicked(); 
    virtual void on_pushButton_5_clicked(); 
} 

class TestStatusForm : public TestListForm 
{ 
    Q_OBJECT 
    .... 
}; 

class DisplayTestResultsForm : public TestStatusForm 
{ 
    Q_OBJECT 

private slots: 
    void on_pushButton_1_clicked(); 
    void on_pushButton_2_clicked(); 
    void on_pushButton_3_clicked(); 
    void on_pushButton_4_clicked(); 
    void on_pushButton_5_clicked(); 
} 

Когда я называю on_pushButton_1_clicked в DisplayTestResultsForm, я получаю эту функцию вызывался трижды. Я не делаю никакого явного вызова соединения, поскольку Ui позаботится об этом с помощью ConnectSlotByName. Может ли кто-нибудь предложить, в чем проблема?

Заранее спасибо.

+0

Вполне вероятно, что это как-то связано дважды. – user3528438

+0

Как проверить, подключено ли оно дважды или нет? Если да, то как его удалить? – user3744269

+0

Отправьте свой код с вызовом ConnectSlotByName(). – kh25

ответ

0

Есть две ошибки:

  1. Частные слоты являются локальными. Нет смысла делать их виртуальными, поскольку их не производный класс не видит. Вы должны сделать слоты защищенными.

  2. Если у вас есть виртуальные слоты, вы должны только объявить их MOCраз. Макрос slots пуст и имеет смысл только для moc инструмент. Самый базовый класс, объявляющий слоты, должен объявить их слотами. Все производных классов должны не объявить их как слоты, а просто как Q_DECL_OVERRIDE reimplementations.

Таким образом:

class TestListForm : public TestBaseForm 
{ 
    Q_OBJECT 
protected slots: // protected, not private 
    virtual void on_pushButton_1_clicked(); 
    virtual void on_pushButton_2_clicked(); 
    virtual void on_pushButton_3_clicked(); 
    virtual void on_pushButton_4_clicked(); 
    virtual void on_pushButton_5_clicked(); 
} 

class TestStatusForm : public TestListForm 
{ 
    Q_OBJECT 
protected: // protected, overriden, no slots macro 
    void on_pushButton_1_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_2_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_3_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_4_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_5_clicked() Q_DECL_OVERRIDE; 
} 
+0

Привет, куба, спасибо за ваше предложение. Да, виртуальные слоты не должны быть закрытыми. виноват. Я включил ваши предложения, и теперь я получаю эту функцию дважды. В файле moc я смог увидеть его только один раз в базовом классе, как показано ниже: moc_testlistform.cpp: 40: "TestListForm \ 0on_pushButton_1_clicked \ 0" moc_testlistform.cpp: 82: case 0: _t-> on_pushButton_1_clicked(); ломать; – user3744269

+0

@ user3744269 Я думаю, что вы стали жертвой не предоставления достаточного кода, потому что с изменениями, изложенными выше, код отлично подходит ** и работает нормально **. Кажется, я знаю, что ты делаешь. Метод 'Ui :: setupUi' устанавливает для вас соединения, вызывая' QMetaObject :: connectSlotsByName'. Если вы вызываете 'Ui: setupUi' в один из базовых классов, а затем другой в производном классе, вы получите это поведение. Это так? Если да, пусть это будет напоминанием о том, что, не предоставляя отдельного тестового примера, вы стреляете в ногу и тратите время каждого - ваше тоже. –

+0

Спасибо, что показал указатель. Ты прав. setupUi также вызывался в производном классе. После удаления setupUi в производном классе он работал, как ожидалось. Qt очень много нового для меня. эти проблемы будут новыми. Если бы я знал это, я бы не допустил этой ошибки. еще раз спасибо за решение моей проблемы. – user3744269

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