C ++ GUI如何在第二个窗口中使用来自一个窗口的私有数据

时间:2015-10-21 11:26:44

标签: c++ qt

我在Qt遇到了问题。我必须制作两个窗口: 在第一个中,您可以单击10个按钮,每个按钮必须在第二个窗口的comboBox中添加一个项目(按钮的名称)。但是我不能参考这个comboBox。我没有任何想法:(

我试图让变量受到保护和公开,但它不起作用。我已将window2.h添加到window1,我试图做这样的事情:

//this is in window1
void window1::on_button1_clicked() { 
    window2::combo->addItem("button1"); 
}

2 个答案:

答案 0 :(得分:0)

您可以将按钮的单击信号连接到第二个窗口中的插槽。此插槽会将信息添加到组合框中。

为此,您需要区分彼此的信号。最好的方法是使用QSignalMapper

class window1 {
    Q_OBJECT
    ... // your other definitions...
    QSignalMapper* signalMapper;
};

window1::window1 (/*your constructor's parameters*/) {
    signalMapper = new QSignalMapper(this); // Will map each buttons' signals to a signal with a QString parameter.

    // You can do an iteration instead of this if your buttons are on a container.
    signalMapper->setMapping(button1, QString("button1"));
    signalMapper->setMapping(button2, QString("button2"));
    // ...
    signalMapper->setMapping(button10, QString("button10"));

    // Same comment as above applies here.
    connect(button1, SIGNAL(clicked()),
            signalMapper, SLOT(map());
    connect(button2, SIGNAL(clicked()),
            signalMapper, SLOT(map());
    // ...
    connect(button10, SIGNAL(clicked()),
            signalMapper, SLOT(map());

    connect(signalMapper, SIGNAL(mapped(QString)), 
            window2, SLOT(updateCombo(QString)));
}

class window2 {
    Q_OBJECT
    ... // your other definitions...
public slots:
    void updateCombo(QString);
};

void window2::updateCombo(QString str) {
    combo->addItem(str);
}

答案 1 :(得分:0)

除了QSignalMapper方法,您可以在window1(setName("buttonXYZ"))中命名按钮对象,将单击的信号连接到window2中的插槽,并询问发送方的对象名称(sender()->name())。

所以在接收槽中你可以做到:

m_combo->addItem(sender()->name());

or

if(sender()->name() == "Button1") {
   m_combo->addItem("Foo");
}