单击按钮时会隐藏位于其他类中的另一个按钮

时间:2014-10-04 02:55:27

标签: c++ qt hide qt5

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

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

4 个答案:

答案 0 :(得分:0)

按下按钮时,您正在堆栈上创建Widget的本地实例。您应该持有指向Widget对象的指针来访问它或使用信号槽机制。只需使用Dialog类中的信号,该信号连接到Widget类中的某个插槽。当按下按钮时,发出信号并隐藏接收槽中的按钮。

答案 1 :(得分: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();

答案 2 :(得分: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();
}
...

答案 3 :(得分:0)

每次按下按钮,您都会创建Widget课程的新实例。您应该做的是将Dialog对象中的信号连接到现有Widget对象的插槽。

您的代码中的某个位置正在创建Dialog类的实例。事实证明它在你的Widget课程中。创建该实例时,请将其信号连接到Widget对象的插槽:

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

按下应该隐藏Dialog::hideSignal对象中另一个按钮的按钮时发出Widget。在Widget::hideSlot里面你只需隐藏按钮。