2010-04-22 36 views
2

我定義了兩個部件如下Qt中,無法顯示子部件

class mainWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    mainWindow(); 
    void readConfig(); 
private: 
    SWindow *config; 
    QVector <QString> filePath; 
    QVector <QLabel*> alias,procStatus; 
    QVector <int> delay; 
    QGridLayout *mainLayout; 
    QVector<QPushButton*> stopButton,restartButton; 
    QVector<QProcess*> proc; 
    QSignalMapper *stateSignalMapper, *stopSignalMapper, *restartSignalMapper; 
public slots: 
    void openSettings(); 
    void startRunning(); 
    void statusChange(int); 
    void stopProc(int); 
    void restartProc(int); 
    void renew(); 
}; 
class SWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    SWindow(QWidget *parent=0); 
    void readConfig(); 
    void addLine(int); 
private: 
    QVector<QPushButton*> selectButton; 
    QVector<QLabel*> filePath; 
    QVector<QLineEdit*> alias; 
    QSignalMapper *selectSignalMapper; 
    QVector<QSpinBox*> delay; 
    QGridLayout *mainLayout; 
public slots: 
    void selectFile(int); 
    void saveFile(); 
    void addLineSlot(); 
}; 

當我創建並從主窗口顯示SWindow對象這樣

void mainWindow::openSettings() 
{ 
    config = new SWindow(); 
    config->show(); 
} 

一切正常,但現在我需要從SWindow訪問主窗口,並且

void mainWindow::openSettings() 
{ 
    config = new SWindow(this); 
    config->show(); 
} 

不顯示SWindow。我如何顯示SWindow?

如何在窗口小部件關閉時調用函數?

回答

2

默認情況下,一個QWidget isn't a window。如果它不是一個窗口,並且指定了一個父窗口,它將會顯示在父窗口內部(因此在您的情況下它可能被您的mainWindow中的其他窗口部件隱藏)。

請看windowFlags()。或者你可以讓你的SWindow從QDialog繼承,這取決於你使用它的方式。

至於調用小部件關閉功能:你可以重新實現closeEvent()

+0

問題是他爲什麼要這樣做。他試圖從他的'SWindow'類中調用'((mainWindow *)parent()) - > renew()',這是非常糟糕的。 – 2010-04-22 22:51:15

2

當你做config = new SWindow(this);你設置config的父母爲mainWindow的實例。

這意味着config不再是頂層插件,因此它不會在mainWindow實例(具體地,其將需要中央插件或mainWindow實例的佈局內要被顯示)的外部顯示。

編輯:對不起 - 我錯過了你最後一個問題; 如何在窗口小部件關閉時調用函數

您會希望覆蓋QWidget::closeEvent(QCloseEvent *event)方法。這在關閉頂級窗口小部件時被調用。最實際的做法是emit()一個信號,以便另一個類可以處理它已關閉。

+0

有沒有辦法從SWindow調用主窗口未做主窗口的SWindow一個孩子? – Blin 2010-04-22 22:14:10

+0

我不確定你的意思是「調用mainWindow」 - 這是你的類名。你究竟想要做什麼? – 2010-04-22 22:19:41

+0

調用創建SWindow實例的mainWindow實例。我需要在單擊SWindow按鈕時調用mainWindow的renew()函數。 – Blin 2010-04-22 22:24:03

2

正如Leiaz所述,您可以在創建小部件時使用windowsFlags標誌。它應該是這樣的:

void mainWindow::openSettings() 
{ 
    config = new SWindow(this, Qt::window); 
    config->show(); 
} 

重新實現的closeEvent:

頭:

protected: 
    virtual void closeEvent (QCloseEvent * event) 

CPP:

void sWindow::closeEvent(QCloseEvent *event) 
{ 
    this->parentWidget()->SomeFunction(); 
    qWidget::closeEvent(event); 
} 

但是,它可能更好地使用信號/插槽在這裏你的情況。既然你說你想在sWindow中點擊一下按鈕來調用父級的更新方法,你想要的是每次單擊按鈕時發出一個信號,並將父級的信號與父級的刷新槽連接起來。

void sWindow::sWindow() 
{ 
    ... 
    connect(ui.button, SIGNAL(clicked()), this, SLOT(btnClicked())); 
} 
void sWindow::btnClicked() 
{ 
    // whatever else the button is supposed to do 
    emit buttonClicked(); 
} 

,並在你的父類

void mainWindow::openSettings() 
{ 
    config = new SWindow(this, Qt::window); 
    connect(config, SIGNAL(buttonClicked()), this, SLOT(refresh())); 
    config->show(); 
}