我有2个班级,在头等舱,我有一个QPushButton,在第二个班级我有一个QLabel(我把它放在“公共”)。我想当用户点击第一堂课时,第二堂课的QLabel会改变文字。我想我会写一个函数来做那个,当用户点击按钮时,按钮会调用这个函数,这是我的函数(在我看来):
void A::buttonClicked(B *bClass)
{
bClass->label->setText("Button was clicked!");
}
这就是我在第一堂课上用我的按钮叫它的方式:
connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked(B)));
但我不知道为什么当我点击时,第二类的标签没有改变。我该怎么办?抱歉我的英文
答案 0 :(得分:2)
您的代码的问题在于您尝试将没有参数的信号连接到需要一个参数的插槽:
connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked(B)));
当您运行类似QObject::connect: Incompatible sender/receiver arguments
的应用时,您可能会收到一条消息。所以那不行。
要解决此问题,您只需在课程B
中添加一项功能即可更改QLabel
的文字。
void B::changeLabelText(const QString &text)
{
label->setText(text);
}
然后在课程A
中有一个插槽,调用类changeLabelText(const QString &text)
中的B
函数,并将其连接到按钮的点击信号:
objectB = new B;
connect(button, SIGNAL(clicked()), this, SLOT(clickedSlot()));
...
void A::clickedSlot()
{
objectB->changeLabelText("Button clicked");
}
请务必将其声明为A.h
中的插槽:
public slots:
void clickedSlot();
答案 1 :(得分:1)
这将有助于你必须建立两个连接
connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked());
connect(button, SIGNAL(clickedSomeButton(B)), this, SLOT(buttonClicked(B)));
在插槽buttonClicked()中执行此操作
void buttonClicked(){
emit clickedSomeButton(B);
}
在使用signal
和slots
时,您必须记住,slot
的参数可以等于或小于它所连接的信号,因为这样的原因您的代码不是工作
您需要做的是为按钮1的单击操作创建一个插槽。然后在插槽中你再次发出一个带有参数B的信号(这个你需要自己定义的信号),这个信号可以被你提到的插槽捕获,即buttonClicked(B)
要创建信号,请使用此语法
signals:
double clickedSomeButton(B &)