2017-05-24 9 views
0

私はuiが表示された後にメソッドを呼び出す必要があるので、特にshow信号を使用して のフレームを接続します。 qtcreatorによって自動生成されたコードで新しいフォームを作成しました。これは自動生成ヘッダーです。自動生成されたUiをqtの送信者と受信者の両方に使用する

のcppファイル内
#define STARTWINDOW_H 
#include <QMainWindow> 

namespace Ui { 
class StartWindow; 
} 

class StartWindow : public QMainWindow 
{ 
Q_OBJECT 

public: 
explicit StartWindow(QWidget *parent = 0); 
~StartWindow(); 

private: 
Ui::StartWindow *ui; 

public slots: 
void doSomething(); 
}; 

#endif // STARTWINDOW_H 

次のコードの誰もが

connect(ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

connect(*ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

connect(this->ui,SIGNAL(QEvent::Show),this,SLOT(doSomething())); 

を仕事にそれを行うための正しい方法は何ですか?

+0

'Uiを:: Foo'はPODクラスであり、信号やスロットもありません。その唯一の用途は、さまざまなウィジェットとレイアウト、および初期化コードを保持することです。 'connect(this、...、this、...)'が必要です。 –

答えて

1

ここで間違っていくつかのことがあります。ノーショー()シグナルと

  • があった場合でもありません

    1. 、あなたは正しく接続し使用していません。

    まず、あなたのクラスは、次のように定義されている場合:

    namespace Ui { class MainWindow; } 
    
    class MainWindow : public QMainWindow 
    { 
        Q_OBJECT 
    public: 
        explicit MainWindow(QWidget *parent = 0); 
        ~MainWindow(); 
    
    signals: 
        void someSignal(); 
    
    public slots: 
        void doSomething() {} 
    
    private: 
        Ui::MainWindow *ui; 
    }; 
    

    コンストラクタでconnectへの適切な呼び出しは次のようになります。
    QWidget::connect(this, SIGNAL(someSignal()), this, SLOT(doSomething()));

    ショー信号があった場合でも、あなたはuiから取得できない場合は、thisから取得します。 UIクラスは、デザイナを使用して追加するウィジェットの単純なコンテナです。あなたのクラスが表示されたとき、あなたは
    virtual void showEvent(QShowEvent *);(より強固な、しかし少し複雑な)

    または単にあなた自身のショー()何をしたいんスロットとの通話を定義を上書きするか、何らかのアクションを実行するには

    QWidget :: show()はその最後にあります。私は後者を好むので、私はあなたにそれを示します。このようなあなたのショースロットを定義することによって

    スタート:

    namespace Ui { class MainWindow; } 
    
    class MainWindow : public QMainWindow 
    { 
        Q_OBJECT 
    public: 
        explicit MainWindow(QWidget *parent = 0); 
        ~MainWindow(); 
    
    public slots: 
        void doSomething() {} 
        void show(); 
    
    private: 
        Ui::MainWindow *ui; 
    }; 
    

    次に、あなたの実装ファイルで、次の操作を行います。

    私は今、かなりの時間のためにQtフレームワークで働いている
    void MainWindow::show() 
    { 
        doSomething(); 
        QWidget::show(); 
    } 
    

    、ショーイベントをオーバーライドする必要は一度もありません。ほとんどのユースケースではそれだけの価値はありません。他の人が接続できるショー信号が本当に必要な場合は、カスタム信号を追加してMainWindow::show()に発信してください。あなたがやっていることのためにこの仕事をすることができない場合にのみ、イベントハンドラをオーバーライドすることに頼ってください(非常にはほとんどありません)。

  • 1

    信号は、デフォルトでは存在しないことを、我々はshowEvent()メソッドをオーバーライドすることができ、それを作成する必要があります。

    の.h

    protected: 
        void showEvent(QShowEvent *event); 
    
    signals: 
        void showSignal(); 
    

    。CPP

    connect(this, &StartWindow::showSignal, this, &StartWindow::doSomething); 
    
    void StartWindow::showEvent(QShowEvent *event) 
    { 
        emit showSignal(); 
        QMainWindow::showEvent(event); 
    } 
    
    void StartWindow::doSomething() 
    { 
        qDebug()<<"show"; 
    } 
    

    それともeventFilterメソッドをオーバーライドすることができます。

    .H

    protected: 
        bool eventFilter(QObject *watched, QEvent *event); 
    
    signals: 
        void showSignal(); 
    

    の.cpp

    installEventFilter(this); 
    
    connect(this, &StartWindow::showSignal, this, &StartWindow::doSomething); 
    
    bool StartWindow::eventFilter(QObject *watched, QEvent *event) 
    { 
        if(watched==this && event->type() == QEvent::Show) 
         emit showSignal(); 
        return QMainWindow::eventFilter(watched, event); 
    } 
    
    +0

    私は最初のメソッドを使用しました。doSomething()メソッドは連続して実行され、connect(....)文字列はStartWindowのコンストラクタにあります。そのため、2つの問題があります。とにかくフォームが表示されているときにコンストラクタ中に送信されません。たとえ私が最後に切断を追加したとしても、フォームが表示される前にスロットが呼び出されます –

    関連する問題