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

时间:2013-09-16 19:46:25

标签: c++ qt

我有问题。我想在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 newbie有什么帮助吗?

3 个答案:

答案 0 :(得分:0)

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

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

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

    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()广告位。

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

答案 2 :(得分:0)

您需要在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 Documentation)并不重要。 希望这会有所帮助。