2016-05-15 74 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