2015-03-03 2 views
0

Я делаю приложение с использованием C++ Qt Framework. Проблема, которую я имею на данный момент, похожа на отправку формы. Мне нужно добавить клиента в систему. Поэтому, когда вы нажимаете кнопку «Добавить клиент», ему необходимо отправить текст из QLineEdit и QDate из QDateEdit в функцию.Не удается заставить QSignalMapper работать

Чем больше я исследовал, тем больше кажется, что мне нужно использовать QSingalMapper, но я не могу заставить его работать вообще.

Вот фрагмент кода, который я пытался использовать первым. У меня есть структура данных клиента с датой имени и присоединения, которую необходимо отправить. Тем не менее, я могу создать объект Client и передать его в качестве параметра insead, если это лучшая идея.

QObject::connect(addClientBtn, SIGNAL(clicked()), this, SLOT(addClient(clientName->text(), joiningDate->date()))); 

Когда я пытался использовать QSignalMapper, он продолжал говорить мне, что я не могу отправить объект клиента, так как его не типа QString, Widget * и т.д.

Есть ли может быть более простой способ сделать это, что я упустил? Любая помощь будет принята с благодарностью.

+0

Я не знаю, почему вы беспокоитесь о картотеке сигналов в таком случае. Просто подключите сигнал 'clicked' вашей кнопки к некоторому слоту, где вы либо испускаете другой сигнал, либо просто вызываете нужную функцию напрямую. – thuga

ответ

2

Вам не нужен QSignalMapper, если я вас правильно понимаю, но его трудно сказать, поскольку вы вряд ли разместили какой-либо код. Особенно сложно, потому что мы понятия не имеем, что такое this. Но если предположить, что это QDialog или QMainWindow, вы должны сделать что-то по следующему:

в определении класса .h

... 
protected slots: 
    void add_client(); 
... 

в реализации класса .CPP

mydialogormainwindow::mydialogormainwindow(){ 

    QObject::connect(addClientBtn, SIGNAL(clicked()), this, SLOT(addClient())); 
} 

void mydialogormainwindow::add_client(){ 

    QString name = clientName->text(); 
    QDate date = joiningDate->date(); 
    .... 
} 

Это связано с сигнальным слотом подключение. Сигнал посылает сигнал, включающий параметры, которые отправляются в слот. Сигнал с щелчком не имеет параметров, поэтому он не может отправить ничего в слот. Но если слот определяется в том же классе, вы можете напрямую получить доступ к данным.

Примечание: Это работает только если ваш класс является производным QObject (что имеет место для QDialog и QMainWindow) и имеет Q_OBJECT макрос в своем определении класса.

+0

О, хорошо, это на самом деле имеет большой смысл. «this» ссылается на QMainWindow, я не был уверен в том, что мне удалось получить доступ к clientName и joiningDate в самой функции, но я просто глуп. Большое спасибо за прояснение этого! – nickcorin