【问题标题】:Pass a widget in argument of a SLOT在 SLOT 的参数中传递一个小部件
【发布时间】:2019-12-24 12:47:48
【问题描述】:

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

【问题讨论】:

    标签: c++ qt c++11 button signals-slots


    【解决方案1】:

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

    其次是行...

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

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

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

    void awesomeFunction(QLineEdit *myQLineEdit);
    

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

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

    【讨论】:

      【解决方案2】:

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

      用途:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2020-08-08
        • 2021-10-31
        相关资源
        最近更新 更多