[英]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 缺乏了解,因為您不了解插槽和信號的工作原理。 這段代碼或多或少只是一堆沒有任何深入思考的隨機代碼。 至少有四個關鍵問題(我希望我沒有忽略更多)。 可能還有更多次要/風格的。 當你寫作時,你是一個初學者,所以這沒關系,但你需要學習更多的基礎知識,然后再深入研究更復雜的東西。
MainWindow
構造函數中的dialogParams
未初始化,這是未定義的行為。 因此,連接根本不起作用。
您在on_actionSet_Parameters_triggered
中創建dialogParams
作為局部變量,它不會初始化成員指針MainWindow::dialogParams
。 它們只是兩個不同的變量。 此外,在 MainWindow 關閉之前,創建的對話框對象不會被刪除。 它實際上是一種 memory 泄漏。
on_OKbtn_clicked()
是一個插槽而不是信號,因此您不能將其作為信號連接。
我沒有看到從QAction::triggered
到任何插槽的任何連接。 如果您希望自動連接到on_actionStart_triggered(x, y)
那么它將不起作用,因為它具有參數不匹配。
這四個中的任何一個都會導致該程序無法運行。 你需要修復所有這些。 因此,您需要覆蓋代碼的主要部分,並牢記我剛剛指出的所有問題。
還有一些建議:
Qt::UniqueConnection
參數添加到connect
,因為它通常是您真正想要的。QDialog::accepted
信號來表示對話已確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.