2011-12-25 2 views
1

(異常な方法で)接続する信号

template<class Ui_Class> 
class Base_Dialog : virtual public QDialog, protected Ui_Class 
{ 

protected: 

    QDialog* caller_; 

public: 
    template<class Implementation> 
    Base_Dialog(Implementation*const & imp,QDialog *caller,QWidget* parent = nullptr); 

}; 

template<class Ui_Class> 
template<class Implementation> 
Base_Dialog<Ui_Class>::Base_Dialog(Implementation*const& imp,QDialog *caller,QWidget* parent): 
    QDialog(parent), 
    caller_(caller) 
{ 
    setupUi(imp); 
} 

を私はそうのようにそれを使用しています:

class My_Class : public **Base_Dialog<Ui::My_Class>** 
{ 
    Q_OBJECT 


public slots: 
    void display_me() 
    {/*THIS IS NOT GETTING CONNECTED*/ 
     QMessageBox::warning(this,"Aha!","Aha!"); 
    } 

public: 
    explicit My_Class(QDialog* caller = nullptr,QWidget *parent = nullptr); 

}; 

Line_Counter::Line_Counter(QDialog* caller,QWidget *parent) : 
    Base_Dialog(this,caller,parent) 

{ 
    //setupUi(this);//THIS WORKS BUT I'D RATHER CALL IT FROM Base_Dialog 


} 

これ以上の構築物をしたとしていますQDialogおよびUiクラスから継承する方法を簡単にし、簡素化します。これは、スロットと信号がクラスに導入されたときに何らかの理由で基底クラスがそれらを参照しない(スロット/シグナル)ことを除いて動作します。 My_ClassでsetupUiを呼び出すと、すべて正常に動作しますが、Base_Classで呼び出す方が好きです。それを行う方法はありますか?

+0

次のようなエラーが表示されますか: 'No such slot BaseDialog :: displayMe()'? – cmannett85

+0

mocがテンプレートを正しく処理しない可能性があります。 ui生成コードを含む慣用的な方法は、Ui :: My_Classをメンバとして持つことです。 –

+0

@ cbamber85私が得ているメッセージは、QDialogでそのようなスロットのようなものではありません。 – user336635

答えて

1

lineCounterのコンストラクタもMy_Classに名前を変更する必要があります。

virtual const QMetaObject * metaObject() constのBase_Dialogのコンストラクタで返されるメタオブジェクトは、この段階ではまだMy_Classインスタンスのインスタンスではないため、Base_Dialogのメタオブジェクトです。 My_CLassは、この仮想メソッド(Q_OBJECTマクロでは目に見えない)をオーバーライドしますが、My_Classコンストラクターコードが実行を開始した後でのみ、Base_Dialogコードの終了後を意味します。信号とスロットは接続中に内部的にメタオブジェクトを使用するため、このように動作しません。

要約 - Base_Dialogのコンストラクタは、My_Classインスタンスが作成されているため、そのコンテンツにアクセスできないため、これを行うことはできません。

CRTPを使用してこの問題をバイパスすることもできますが、この場合、私はそれが実行可能かどうかわかりません。むしろQtのやり方を選択したいと思っています。つまり、My_ClassコンストラクタからsetupUiを呼び出します。

+0

#j_kubik fair enough。途中でありがとう、私はcrtpを試したし、それは私のために働かなかった。 – user336635

+0

ありがとう、私はすでにそれを受け入れたと思った。 – user336635