当点击按钮隐藏另一个按钮位于其他职业

问题描述:

我有两个类。
第一类叫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(); 
} 

怎么做,或有什么问题在我的代码?

您每次按下按钮时都会创建一个Widget类的新实例。你应该做的是将一个来自Dialog对象的信号连接到你现有的Widget对象的一个​​插槽。

在代码中的某处,您正在创建Dialog类的实例。事实证明,这是在你的Widget类。当您创建实例,其信号连接到您的Widget对象的插槽:

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

,并发出Dialog::hideSignal当你按下应该隐藏在Widget对象的其他按钮按钮。而在Widget::hideSlot里面你只需隐藏按钮。

当按下按钮时,您正在堆栈上创建本地实例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

试试这个,但我仍然认为信号和插槽机制更好。 (因为它推荐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

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