首页 文章

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

提问于
浏览
0

我有一个小问题 . 我想在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) 函数)?我必须如何以及在何处发送信号并 Build 连接?

我喜欢信号和插槽,但我的代码不起作用 - 我不粘贴它,因为它很可怕:)

Qt新手有什么帮助吗?

3 回答

  • 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) . 希望这可以帮助 .

  • 0

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

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

    • 将一个作为朋友类声明给另一个 . 然后他们可以看到 protectedprivate 变量/成员

    • 可以使插槽静态,因此您可以在没有类对象的情况下调用它们 .

    例如,

    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() 插槽 .

  • 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)并将其连接到slot

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

    信号将字符串传递给插槽 .

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

    • 要将信号连接到插槽(或另一个信号),它们必须具有相同的参数

    • 信号和插槽中的参数顺序应相同 .

    • 如果信号的参数多于它所连接的插槽的参数,则简单地忽略附加参数,但不可能相反 .

    • 如果要将具有不匹配参数的信号连接到插槽,则不会发生编译时错误,但在运行时命令窗口将显示警告信号/插槽/连接不存在 .

相关问题