0

我曾经在那里发布过一个问题:通过按钮更改另一类中的文本但是当第二类由第一类创建时它才起作用。现在我有 2 个类,它们是同时创建的,那么如何连接在一起呢?下面是我的所有代码,第一类有一个按钮,第二类有一个标签,我想当用户点击第一类的按钮时,第二类的标签会改变。它们被放入stackWidget:

// file.h

#include <QWidget>
#include <QtGui>

class widgetA;
class widgetB;

class A : public QWidget
{
    Q_OBJECT
public:
    explicit A(QWidget *parent = 0);
private:
    QComboBox* comboBox;
    QStackedWidget* stackWidget;
    widgetA *wa;
    widgetB *wb;
};

class widgetA : public QWidget
{
    Q_OBJECT
public:
    widgetA(QWidget *parent = 0);
public slots:
    void buttonClicked();
private:
    QPushButton* button;
};

class widgetB : public QWidget
{
    Q_OBJECT

public slots:
    void labelChangeText(const QString);

public:
    widgetB(QWidget *parent = 0);
    QLabel* label;
};

这是cpp文件:

//file.cpp

#include "a.h"

A::A(QWidget *parent) :
    QWidget(parent)
{
    comboBox = new QComboBox(this);
    comboBox->addItem(tr("Widget A"));
    comboBox->addItem(tr("Widget B"));

    wa = new widgetA(this);
    wb = new widgetB(this);

    stackWidget = new QStackedWidget(this);
    stackWidget->addWidget(wa);
    stackWidget->addWidget(wb);
    stackWidget->setCurrentIndex(0);
    connect(comboBox, SIGNAL(currentIndexChanged(int)), stackWidget, SLOT(setCurrentIndex(int)));

    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(comboBox);
    layout->addWidget(stackWidget);

    setLayout(layout);
}

widgetA::widgetA(QWidget *parent):
    QWidget(parent)
{
    button = new QPushButton(tr("Click"));
    connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
    QHBoxLayout* lay = new QHBoxLayout;
    lay->addWidget(button);
    setLayout(lay);
}

void widgetA::buttonClicked()
{
    // what I have to do at there for call the function at widgetB class?
}

widgetB::widgetB(QWidget *parent):
    QWidget(parent)
{
    label = new QLabel("....");
    QHBoxLayout* lay = new QHBoxLayout;
    lay->addWidget(label);
    setLayout(lay);
}

void widgetB::labelChangeText(const QString text)
{
    label->setText(text);
}

P/S:对不起我的英语

4

2 回答 2

1

您可以将widgetB对象的指针传递给widgetA,也可以将信号从 连接widgetA到 中的插槽widgetB

这是信号/插槽选项的示例:

// widgeta.h
signals:
   void changeText(QString text);

-

// widgeta.cpp
void widgetA::buttonClicked()
{
   emit changeText("button clicked");
}

-

//widgetb.h
public slots:
  void labelChangeText(const QString & text);

-

// a.cpp
connect(wa, SIGNAL(changeText(QString)), wb, SLOT(labelChangeText(QString)));
于 2013-08-12T07:29:46.913 回答
1

是什么阻碍你在 widgetA::buttonClicked() 中调用 wb->labelChangeText("some string")?您在 A 类中有一个指向 widgetB 的指针。labelChangeText 在 B 类中是公共的。只是它是一个插槽并不意味着您不能将其作为普通方法调用。

于 2013-08-10T16:33:37.397 回答