【问题标题】:No such slot QLineEdit::setText没有这样的插槽 QLineEdit::setText
【发布时间】:2016-05-18 21:06:14
【问题描述】:

我正在尝试将按钮连接到 lineEdit。当单击按钮时,将 lineEdit 的文本设置为“Hello”。 但我的信号和插槽有问题!

This is my form

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton,SIGNAL(clicked()),ui->lineEdit,SLOT(setText("Hello")));
}
MainWindow::~MainWindow()
{
    delete ui;
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QPushButton>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

应用程序输出

Starting C:\Qt\Qt5.3.0\Tools\QtCreator\bin\build-E01S01-Desktop_Qt_5_3_0_MSVC2013_OpenGL_64bit-Debug\debug\E01S01.exe...
QObject::connect: No such slot QLineEdit::setText("Hello") in ..\E01S01\mainwindow.cpp:9
QObject::connect:  (sender name:   'pushButton')
QObject::connect:  (receiver name: 'lineEdit')

【问题讨论】:

标签: c++ qt


【解决方案1】:

您只能将SIGNAL 连接到SLOT,前提是它们具有相同的签名。 你可以使用QSignalMapper来完成你想要的:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper, SIGNAL(mapped(const QString&)), ui->lineEdit, SLOT(setText(const QString&)));
QObject::connect(ui->pushButton, SIGNAL(clicked()), mapper, SLOT(map()));
mapper->setMapping(ui->pushButton, tr("Hello"));

【讨论】:

    【解决方案2】:

    由于您使用的是 Qt5,因此您可以使用 lambda 表达式。 首先确保通过在您的.pro 文件中添加CONFIG += c++11 来启用c++11

    #include <QApplication>
    #include <QWidget>
    #include <QLayout>
    #include <QLineEdit>
    #include <QPushButton>    
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = 0) : QWidget(parent)
        {
            setLayout(new QVBoxLayout);
            QLineEdit *lineEdit = new QLineEdit("TEXT");
            QPushButton *button = new QPushButton("BUTTON");
            connect(button, &QPushButton::clicked, this, [=]{lineEdit->setText("PRESSED");});
    
            layout()->addWidget(lineEdit);
            layout()->addWidget(button);
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.show();
    
        return a.exec();
    }
    
    #include "main.moc"
    

    【讨论】:

    • 感谢您发布此答案。我不认为这样的解决方案,因为我被卡住(依赖库兼容性问题)必须在大约 1/2 的工作应用程序上支持 Qt4,所以现在即使我在 Qt5 中开发,我也使用旧的连接语法。
    • @drescherjm 我自己也有类似的情况。我所做的是使用可用的最新 Qt 版本制作一些爱好/测试项目,只是为了检查新功能并习惯它们。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多