2016-05-15 52 views
0

我试图将一个按钮连接到lineEdit.when单击按钮,将lineEdit的文本设置为“你好”。 但我有信号和插槽的问题!没有这样的插槽QLineEdit :: setText

This is my form

mainwindow.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; 
} 

mainwindow.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') 
+0

您不能在连接中添加参数。用QSignalMapper解决这个问题。 – drescherjm

+0

[请阅读有关信号和插槽的文档](http://doc.qt.io/qt-5/signalsandslots.html)了解为什么这不起作用。 –

回答

2

只能连接一个如果它们具有相同的签名,则为到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")); 
1

由于您使用QT5,你可以使用lambda表达式。 首先确保c++11已启用,方法是在您的.pro文件中添加CONFIG += 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" 
+0

感谢您发布这个答案..我不认为这样的解决方案,因为我坚持(依赖库兼容性问题)必须支持Qt4在我的应用程序的大约一半工作,所以现在即使我在Qt5开发我使用旧的连接语法。 – drescherjm

+1

@drescherjm我自己也处于类似的情况。我所做的是使用最新的Qt版本制作一些业余爱好/测试项目,只是为了检查新功能并适应它们。 – thuga

相关问题