繁体   English   中英

Qt4:连接插槽和其他形式的信号

[英]Qt4: connect slot and signal from other forms

我有一个问题。 我想从AnotherWindow在MainWindow中运行功能。 我不能为此设置connect()

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

我现在已经连接了按钮信号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()被声明为专用插槽。

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

setVariable(QString)被声明为公共插槽。

我如何将变量从AnotherForm(从btnOkClicked()函数)发送到MainWindow( setVariable(QString)函数)? 我必须在哪里发送信号并建立连接?

我阅读了有关信号和插槽的信息,但是我的代码无法正常工作-我不会在此处粘贴代码,因为这很糟糕:)

对Qt新手有帮助吗?

我不确定我是否理解您的问题,但请允许我尝试。

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

  1. 宣布一个为朋友班。 然后他们可以看到protected变量和private变量/成员
  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()插槽。

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

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. 如果将参数不匹配的信号连接到插槽,则不会发生编译时错误,但在运行时命令窗口将显示警告,提示信号/插槽/连接不存在。

您需要在MainWindow中具有AnotherWindow的引用,反之亦然。 然后,您需要满足以下条件:

// 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文档 )。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM