使用信号和槽

时间:2015-08-19 11:57:27

标签: c++ qt signals-slots qt-signals

我使用QT Creator构建了一个GUI。在某些时候打开一个Dialog窗口,我需要发送一个QStringList类型的变量。我这样做是使用信号和插槽方法。但是,变量一旦发送就变空。 以下是一些代码示例:

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(对话框)

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();
}

我真的很感激这方面的一些帮助。注意:如果我这样做整个方法都错了,应该做一些完全不同的事情,请告诉我!

2 个答案:

答案 0 :(得分:1)

您正在创建两个mysaver个实例,并且仅连接到第一个(不可见)实例:

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

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

mDialog不是您所连接的mysaver个实例。

答案 1 :(得分:0)

显然,您使用的是QVariant而不是QStringList,并且没有编译时间检查。最好以这种方式建立连接:

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

您将在编译时检查类型。

相关问题