0

I have a small problem. I want run function in MainWindow from AnotherWindow. I can't set connect() for it.

Main class: MainWindow
Other form: AnotherWindow
Function in main class: setVariable(QString)
Function in other form: btnClicked()

I have now connected button signal clicked():

// In AnotherWindow.cpp
connect(ui->btnOK, SIGNAL(clicked()), this, SLOT(btnOkClicked()));

// Function in same file
void interfaceWindow::btnOkClicked() {
    /* Some actions - emit signal? */
    this->close();
}

btnOkClicked() are declared as private slot.

// In MainWindow.cpp
void MainWindow::setVariable(QString _var) {
    this->var = _var;
}

setVariable(QString) are declared as public slot.

How I can send variable from AnotherForm (from btnOkClicked() function) to MainWindow (setVariable(QString) function) ? How and where I must send signal and make connection?

I readed about signals and slots, but my code don't work - I don't paste it here because it's terrible :)

Any help for Qt newbie?

4

3 回答 3

0

我不完全确定我理解你的问题,但让我试试。

您希望能够在另一个类中触发一个插槽。有几种方法可以做到这一点。

  1. 将一个声明为另一个的朋友班。然后他们可以看到protectedprivate变量/成员
  2. 可以将插槽设为静态,这样您就可以在没有类对象的情况下调用它们。

例如,

class MainWindow {
    private slot:
    void setVariable(QString);
}



class AnotherWindow {    
    friend class MainWindow;    
    MainWindow *window;

public:
    AnotherWindow() {
       connect(this, SIGNAL(fire(QString)), window, SLOT(setVariable(QString)));
    } 

signals:
    void fire(QString);
public slots:
   void onButtonClicked() {
       emit fire(QString);
   }
}

前一个是伪代码,所以不要指望它编译。我这就是你想要的。基本上,由于您的插槽是私有的,MainWindow因此您需要将其设为朋友。要连接,它需要成为成员。然后当onButtonClicked槽被唤起时,它fire()就是setVarialbe()槽。

于 2013-09-16T20:28:31.917 回答
0

您需要在 MainWindow 中引用另一个窗口,反之亦然。然后你需要以下东西:

// AnotherWindow.h
signals:
    void buttonOkClickedSignal(QString var);

// AnotherWindow.cpp
void interfaceWindow::btnOkClicked() {
    emit buttonOkClickedSignal("The button got clicked!");
    this->close();
}

下一步取决于 MainWindow 是否引用了 AnotherWindow,反之亦然。您可以:

// AnotherWindow.cpp
connect(this, SIGNAL(buttonOkClickedSignal(QString), &mainWindow, SLOT(setVariable(QString)));

或者:

// MainWindow.cpp
connect(&anotherWindow, SIGNAL(buttonOkClickedSignal(QString), this, (SLOT(setVariable(QString)));

如果您通过信号调用插槽,那么它是私有的还是公共的都无关紧要(请参阅Qt 文档)。希望这可以帮助。

于 2013-09-17T05:05:57.573 回答
0

这是另一个窗口的简单代码:

class MyWidget : public QWidget
{
Q_OBJECT
   public:

MyWidget(QWidget * parent = 0)
{
    okBtn = new QPushButton ("I am Ok!");
    MyData = "";
    connect(okBtn ,SIGNAL(clicked()),this,SLOT(OnOk()));

}
~MyWidget();

private:
  QString MyData;
QPushButton * okBtn;
  //something that modify string MyData
 signals:

    void MyDataSignal(QString);
//Internal slot that emits signal with proper data
private slots:
    void OnOk()
    {
        if(MyData!="")
        {
            emit MyDataSignal(MyData);
        }
    }

};

现在在 MainWindow 中创建一个 MyWidget 对象(假设 myWid)并将其连接到插槽

connect(myWid, SIGNAL(MyDataSignal(QString)),this,SLOT(OnMyWidOkClicked(QString)));

信号会将字符串传递给插槽。

在制作信号和插槽时,请记住以下几点:

  1. 要将信号连接到插槽(或另一个信号),它们必须具有相同的参数
  2. 参数在信号和槽中的顺序应该相同。
  3. 如果一个信号的参数多于它所连接的插槽,则简单地忽略其他参数,但不可能相反。
  4. 如果您将具有不匹配参数的信号连接到插槽,则不会发生编译时错误,但在运行时命令窗口将显示信号/插槽/连接不存在的警告。
于 2013-09-17T04:14:21.987 回答