首页 > 解决方案 > 在 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
}

我的主窗口.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。我错过了一些东西,但我不知道是什么。当我在没有任何参数的情况下使用它时,它可以正常工作。但是当我尝试在参数中传递一个小部件时它不起作用。文档做得很好,但我可以设法通过互联网找到我需要的东西。

标签: c++qtc++11buttonsignals-slots

解决方案


显示的代码有几个问题。首先QObject,暗示从它继承的任何东西都是不可复制的,所以你不能通过QLineEdit值传递:你需要通过引用/指针传递。

其次线...

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

应该在控制台上发出运行时警告,因为插槽需要一个参数——QLineEditQPushButton::released信号没有提供一个参数。

假设QLineEdit您感兴趣,textInput那么您可以使用新的 Qt5 信号/插槽语法和lambda. 所以把awesomeButton签名改成...

void awesomeFunction(QLineEdit *myQLineEdit);

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

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

推荐阅读