2016-05-15 2 views
0

Я пытаюсь подключить кнопку к элементу LineEdit. Когда вы нажимаете на кнопку, задайте текст lineEdit на «Hello». , но у меня есть проблема с сигналом и слотом!Нет такого слота 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

Вы можете подключить только 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")); 
1

Поскольку вы используете Qt5, вы можете использовать лямбда-выражения. Сначала убедитесь, что c++11 включен, добавив CONFIG += c++11 в ваш файл .pro.

#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 примерно на 1/2 моих приложений на работе, поэтому пока даже когда я разрабатываю Qt5 Я использую старый синтаксис connect. – drescherjm

+1

@drescherjm Я сам в подобной ситуации. То, что я делаю, это сделать некоторые хобби/тестовые проекты, используя самую последнюю версию Qt, просто чтобы проверить новые функции и привыкнуть к ним. – thuga

Смежные вопросы