2014-10-04 169 views
1

我有兩個類。
第一類叫Widget,有一個按鈕屬於它,第二類叫dialog,還有一個屬於它的按鈕。
當點擊窗口小部件上的按鈕(Open Dialog)時,會顯示屬於dialog class的窗口對話框。當點擊按鈕隱藏另一個按鈕位於其他職業

我想要的是,當點擊屬於dialog class按鈕隱藏屬於widget class按鈕。

我試圖用正常的方式來做,但我失敗了。

void Dialog::on_doSomthing_btn_clicked(){ 
    Widget *widget = new Widget; 
    QPushButton *btn = widget->findChild<QPushButton *>("OpenDialog_Btn"); 
    btn->hide(); 
} 

而且我已經使用了Signal & Slot方式如下:

widget.h

private slots: 
    void hideButton(); 

widget.cpp

void Widget::hideButton(){ 
    ui->OpenDialog_Btn->hide(); 
} 

dialog.h:

signals:  
    void doHideButton(); 

dialog.cpp:

void Dialog::on_doSomthing_btn_clicked(){ 
    Widget *widget = new Widget; 
    connect(this, SIGNAL(doHideButton()), widget, SLOT(hideButton())); 
    emit doHideButton(); 
    this->close(); 
} 

怎麼做,或有什麼問題在我的代碼?

回答

0

您每次按下按鈕時都會創建一個Widget類的新實例。你應該做的是將一個來自Dialog對象的信號連接到你現有的Widget對象的一個​​插槽。

在代碼中的某處,您正在創建Dialog類的實例。事實證明,這是在你的Widget類。當您創建實例,其信號連接到您的Widget對象的插槽:

Dialog dialog; 
connect(&dialog, SIGNAL(hideSignal()), this, SLOT(hideSlot())); 

,併發出Dialog::hideSignal當你按下應該隱藏在Widget對象的其他按鈕按鈕。而在Widget::hideSlot裏面你只需隱藏按鈕。

0

當按下按鈕時,您正在堆棧上創建本地實例Widget。您應該持有指向Widget的對象的指針以訪問它或使用信號插槽機制。只需使用Dialog類中的信號,該信號連接到Widget類中的某個插槽。當按下按鈕時發出信號並將按鈕隱藏在接收槽中。

+0

我已經使用指針的方式,仍然不工作,再次看到我的代碼,我已經更新了我的問題。 – 2014-10-04 05:29:11

+1

您正在製作一個'Widget'的新實例。您應該有一個指向打開對話框的現有對象的指針。 – Nejat 2014-10-04 05:34:00

+0

你能舉個例子嗎? – 2014-10-04 05:43:02

0

試試這個,但我仍然認爲信號和插槽機制更好。 (因爲它推薦Nejat在這裏和我後來推薦這個給你)

Widget.h:

public: 
    //... 
    void hideBut(); 

Widget.cpp:

void Widget::hideBut() 
{ 
    ui->pushButton->hide(); 
} 

對話框:

//#include "widget.h" 
void Dialog::on_doSomthing_btn_clicked(){ 
    Widget* par = static_cast<Widget*>(parent()); 
    if(par) 
     par->hideBut(); 
} 

和:

Dialog *mDialog = new Dialog(this); 
mDialog->show(); 
+0

謝謝,但不幸的是,你的代碼不適合我。我也使用了'信號和插槽'的方式,也沒有工作,再次看到我的問題,我已經更新了我的問題。 – 2014-10-04 23:29:31

0
MyWidget::MyWidget(QWidget *parent) : 
QWidget(parent) 
{ 
... 
QPushButton *btn = new QPushButton("Button To Hide"); 
connect(btn, &QPushButton::clicked, this, &MyWidget::onButtonToHideClicked); 
... 
} 

void MyWidget::onButtonToHideClicked() 
{ 
QPushButton *btn = (QPushButton*)sender(); 
btn->hide(); 
} 
... 
+0

謝謝,但我不明白你的代碼。 – 2014-10-04 23:14:00

+0

你能說出你不明白的部分嗎?如果使用sender()方法,那麼可以使用sender()方法在一個插槽中獲取sender對象,在這種情況下,它是您單擊的按鈕,因爲我們將點擊的信號連接到構造函數中的onButtonToHideClicked插槽。所以你可以在插槽中打開一個新的對話框,並在這裏隱藏按鈕作爲獲取它的指針並使用sender()方法強制轉換爲QPushButton – cobalt 2014-10-06 16:47:32

+0

但我不想隱藏我單擊的按鈕,我想隱藏另一個按鈕屬於另一個類,如在我的問題中顯示的圖片。 – 2014-10-07 00:22:01

相關問題