2015-08-19 4 views
-2

J'ai créé une interface graphique à l'aide de QT Creator. À un certain point une fenêtre de dialogue est ouverte à laquelle j'ai besoin d'envoyer une variable de type QStringList. Je fais cela en utilisant la méthode des signaux et des slots. Cependant, la variable est vide une fois envoyée. Voici quelques exemples de code:Envoi de QStringList entre les classes à l'aide de signaux et d'emplacements

widget.h

class Widget : public QWidget 
{ 
Q_OBJECT 
public: 
explicit Widget(QWidget *parent = 0); 
~Widget(); 
signals: 
void mySignal(QStringList); 
}; 

widget.cpp

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
// blah blah 
} 

Widget::~Widget() 
{ 
    delete ui; 
} 

    void Widget::on_pushButton_4_clicked() 
{ 
    QStringList dList; 
    int damount = ui->listWidget->count(); 
    for(int i=0; i < damount; i++){ 
            dList << ui->listWidget->item(i)->text(); 
            qDebug() << dList; 
            } 
    emit mySignal(dList); 

    mysaver mDialog; 
    mDialog.setModal(true); 
    mDialog.exec(); 
} 

mysaver.h (La boîte de dialogue)

class mysaver : public QDialog 
{ 
Q_OBJECT 
public: 
explicit mysaver(QWidget *parent = 0); 
~mysaver(); 

public slots: 
void myreciever(QStringList); 
} 

mysaver.cpp

void mysaver::myreciever(QStringList aList) 
{ 
qDebug << aList; 
} 

main.cpp

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
Widget w; 

Widget *duff = new Widget; 
mysaver *buff = new mysaver; 
QObject::connect(duff,SIGNAL(mySignal(QStringList)),buff,SLOT(myreciever(QStringList))); 

w.show(); 

return a.exec(); 
} 

J'apprécierais vraiment un peu d'aide à ce sujet. Note: Si je fais mal toute cette méthode et que je devrais faire quelque chose de complètement différent alors DITES-MOI!

+0

QObject :: connect (duff, SIGNAL (monSignal (QVariant)), buff, SLOT (myreciever (QVariant))); - Pourquoi utilisez-vous QVariant et non QStringList? – demonplus

+0

@demonplus Désolé, c'était une faute de frappe. – Zynky

+0

Je ne vois rien de manifestement faux avec ce code, est-ce que 'damount' est plus grand que zéro? – cmannett85

Répondre

1

Vous créez deux mysaver instances et que la connexion à la première (invisible) un:

// In main.cpp 
mysaver *buff = new mysaver; 

// In Widget::on_pushButton_4_clicked() 
mysaver mDialog; 
mDialog.setModal(true); 
mDialog.exec(); 

mDialog n'est pas l'instance mysaver vous êtes connecté.

+0

C'est la bonne solution et tout fonctionne comme j'en ai besoin. Merci pour votre patience. – Zynky

0

Évidemment, vous utilisez QVariant au lieu de QStringList et il n'y a pas de vérification de la compilation. Il est préférable de faire la connexion de cette façon:

QObject::connect(duff, &Widget::mySignal, buff, &mysaver::myreciever); 

Vous allez vérifier les types en temps de compilation.

+0

Cependant, parfois la nouvelle syntaxe est beaucoup plus difficile que les anciens 'SIGNAL' et' SLOT', malheureusement .. –

+0

Merci pour votre suggestion. Le problème concernant QVariant était une faute de frappe pour laquelle je suis désolé. J'ai essayé de faire la connexion en utilisant votre syntaxe, mais le QStringList "aList" est toujours vide. – Zynky