我有两节课
第一个类叫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 :(得分: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
里面你只需隐藏按钮。