2017-05-24 77 views
0

我需要在顯示UI之後調用方法,所以我想要連接 幀本身,特別是使用show信號。 我用qtcreator創建了一個自動生成的代碼的新表單。這是自動生成的標題。使用自動生成的UI同時用於qt發送者和接收者

#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 
在cpp文件

以下代碼沒有一個工作

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類和既沒有信號也沒有槽。它唯一的用途是保存各種小部件和佈局以及初始化代碼。你想'連接(這,...,這,...)'。 –

回答

1

有幾件事錯在這裏:

  1. 沒有顯示()信號和
  2. 即使有,你沒有使用正確連接。

首先,如果你的類被這樣定義:

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; 
}; 

然後,在實現文件中,這樣做:

void MainWindow::show() 
{ 
    doSomething(); 
    QWidget::show(); 
} 

我現在已經與Qt框架工作了相當長的一段時間,而且我從不需要重寫該節目;對於大多數使用情況來說,這是不值得的。如果您確實需要其他人可以連接的演出信號,只需添加一個自定義信號併發送至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的構造函數中,所以有兩個問題:第一個問題是信號連續發送,無論如何不發送時,窗體顯示,但在構造函數。即使我添加一個斷開連接doSomething插槽被稱爲窗體之前顯示 –

相關問題