簡體   English   中英

如何將對話框的OK按鈕連接到Qt的MainWindow中的QAction按鈕,然后啟動程序的執行?

[英]How to connect an OK button of a dialog to an QAction button in the MainWindow in Qt, which then launch the execution of a programme?

我是 Qt 的初學者,我嘗試了兩天來找出問題所在,不幸的是我做不到,非常感謝您的幫助。 我在主窗口中有一個設置參數,單擊它時會啟動一個對話框,允許用戶輸入 x 和 y 的值。 我正在嘗試連接從對話框中單擊 OK 按鈕的信號以連接到 MainWindow 上的 QAction Start 按鈕,然后單擊該開始按鈕后程序運行,這將兩個數字相乘。

錯誤:Static 斷言失敗:插槽需要比信號提供的更多的 arguments。 信號與槽arguments不兼容

我在這里添加了我的程序的代碼。

主窗口.h

```
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "dialogsetparams.h"
#include <QPushButton>
#include <QAction>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionSet_Parameters_triggered();

    void on_actionStart_triggered(double x, double y);

signals:
    void multiplySignal(double x, double y);

private:
    Ui::MainWindow *ui;

    DialogSetParams *dialogParams;
};
#endif // MAINWINDOW_H

```

主窗口.cpp

```
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogsetparams.h"
#include "multxy.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // connect signal OK clicked from dialog to &QAction Start buttun in mainwindow
    connect(dialogParams, &DialogSetParams::on_OKbtn_clicked, ui->actionStart, &QAction::triggered);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionSet_Parameters_triggered()
{
    DialogSetParams *dialogParams = new DialogSetParams(this);
    dialogParams->show();
}

void MainWindow::on_actionStart_triggered(double x, double y)
{
    // create an instance of class BspMembraneSurf when Start button triggered
    Multxy* multOp = new Multxy();
    multOp->computexy(x, y);
}

```

對話框集參數.h

```
#ifndef DIALOGSETPARAMS_H
#define DIALOGSETPARAMS_H
#include <QDialog>
#include <QObject>

namespace Ui {
class DialogSetParams;
}

class DialogSetParams : public QDialog
{
    Q_OBJECT

public:
    explicit DialogSetParams(QWidget *parent = nullptr);
    ~DialogSetParams();

    double x;
    double y;

public slots:
    void on_OKbtn_clicked();

signals:
    void setParams(double x, double y);

private:
    Ui::DialogSetParams *ui;

};
#endif // DIALOGSETPARAMS_H

dialogsetparams.cpp

    ```
    #include "dialogsetparams.h"
    #include "ui_dialogsetparams.h"
    #include <QPushButton>
    #include <QDebug>
    
    DialogSetParams::DialogSetParams(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::DialogSetParams)
    {
        ui->setupUi(this);
    
        // connect clicked signal to OK button slot
        connect(ui->OKbtn, &QPushButton::clicked, this, &DialogSetParams::on_OKbtn_clicked);
    
        emit setParams(x, y);
    }
    
    DialogSetParams::~DialogSetParams()
    {
        delete ui; 
    }
    
    void DialogSetParams::on_OKbtn_clicked()
    {
        // Get user input from dialog
        x = ui->xDoubleSpinBox->value();
        y = ui->yDoubleSpinBox->value();
    
        accept();
    }
    
    ```


[Set Parameters][1]
[dialog][2]
[errors][3]

  [1]: https://i.stack.imgur.com/KuVbh.png
  [2]: https://i.stack.imgur.com/Rvp8e.png
  [3]: https://i.stack.imgur.com/CHzJf.png

我很抱歉對這段代碼進行了粗略的審查,但這段代碼只是由於缺乏對 C++ 和 Qt 工作原理的理解而造成的混亂。 對 C++ 缺乏了解,因為不了解執行順序、memory 的初始化以及成員變量與局部變量的影子。 並且對 Qt 缺乏了解,因為您不了解插槽和信號的工作原理。 這段代碼或多或少只是一堆沒有任何深入思考的隨機代碼。 至少有四個關鍵問題(我希望我沒有忽略更多)。 可能還有更多次要/風格的。 當你寫作時,你是一個初學者,所以這沒關系,但你需要學習更多的基礎知識,然后再深入研究更復雜的東西。

  1. MainWindow構造函數中的dialogParams未初始化,這是未定義的行為。 因此,連接根本不起作用。

  2. 您在on_actionSet_Parameters_triggered中創建dialogParams作為局部變量,它不會初始化成員指針MainWindow::dialogParams 它們只是兩個不同的變量。 此外,在 MainWindow 關閉之前,創建的對話框對象不會被刪除。 它實際上是一種 memory 泄漏。

  3. on_OKbtn_clicked()是一個插槽而不是信號,因此您不能將其作為信號連接。

  4. 我沒有看到從QAction::triggered到任何插槽的任何連接。 如果您希望自動連接到on_actionStart_triggered(x, y)那么它將不起作用,因為它具有參數不匹配。

這四個中的任何一個都會導致該程序無法運行。 你需要修復所有這些。 因此,您需要覆蓋代碼的主要部分,並牢記我剛剛指出的所有問題。

還有一些建議:

  1. 始終檢查連接是否成功,如果沒有則斷言(在調試模式下)。 理想情況下,將Qt::UniqueConnection參數添加到connect ,因為它通常是您真正想要的。
  2. 永遠不要依賴基於信號/插槽名稱匹配的自動連接。 這太脆弱了。 甚至存在這樣的東西是最糟糕的 Qt 設計缺陷之一。
  3. 使用QDialog::accepted信號來表示對話已確定。
  4. 盡量避免 QtDesigner 和 UI 文件成為瘟疫。 他們是邪惡的。 如果您是初學者,它們只會使您的學習更加困難。 如果你是先進的,他們會讓你的工作更加努力。 只需學習在代碼中設置所有 UI。 它看起來像更多的手工工作,但它有很多好處……而且實際上工作更少,而不是更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM