在 SLOT 的参数中传递一个小部件

Pass a widget in argument of a SLOT

这是我想要做的: 我有一个 QLineEdit 和一个 QPushButton。当我按下按钮时,我想检索 QLineEdit 的文本并用它做一些事情。不幸的是,我很难做到这一点,因为我是 Qt 的新手。

我的mainwindow.cpp(简体):

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLineEdit *textInput = new QLineEdit();
    QPushButton *awesomeButton = new QPushButton();

    retrieveButton->setText("Click me");

    connect(awesomeButton, SIGNAL(released()), this, SLOT(awesomeFunction(QLineEdit)));

}

void MainWindow::awesomeFunction(QLineEdit myQLineEdit) {
    QString exploitedText = myQLineEdit.text();
    //DO STUFF
}

我的mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QLineEdit>
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void awesomeFunction(QLineEdit myQLineEdit);

private:
    QPushButton *awesomeButton;
    QLineEdit *textInput;
    Ui::MainWindow *ui;
};
#endif

main.cpp 没有什么有趣的地方。我错过了一些东西,但我不知道是什么。当我在没有任何参数的情况下使用它时,它工作正常。但是当我尝试在参数中传递 Widget 时,它不起作用。文档做得很好,但我可以设法通过互联网找到我需要的东西。

使用QPushButton::clicked()信号。看看这个信号文档,比如 release(),它没有参数。 Qt 中的槽应与信号具有相同的签名。这些信号不发送任何 QLineEdit's.

使用:

void MainWindow::awesomeFunction() {
    QString exploitedText = textInput->text();
    //DO STUFF
}

显示的代码有几个问题。首先 QObject,并暗示从它继承的任何东西都是不可复制的,所以你不能按值传递 QLineEdit:你需要传递 reference/pointer.

其次……

connect(awesomeButton, SIGNAL(released()), this, SLOT(awesomeFunction(QLineEdit)));

应该在控制台上发出运行时警告,因为插槽需要一个参数 -- QLineEdit -- 但 QPushButton::released 信号不提供一个参数。

假设您感兴趣的 QLineEdittextInput,那么您可以使用新的 Qt5 signal/slot 语法和 lambda。所以将 awesomeButton 签名更改为...

void awesomeFunction(QLineEdit *myQLineEdit);

然后连接到信号(未测试)...

connect(awesomeButton, &QPushButton::released, this,
        [this, textInput]()
          {
            awesomeFunction(textInput);
          });