使用信号和槽在类之间发送 QStringList

Posted

技术标签:

【中文标题】使用信号和槽在类之间发送 QStringList【英文标题】:Sending QStringList between classes using signals and slots 【发布时间】:2015-08-19 11:57:27 【问题描述】:

我有一个使用 QT Creator 构建的 GUI。有时会打开一个对话框窗口,我需要向该窗口发送一个 QStringList 类型的变量。我使用信号和插槽方法来做到这一点。但是,该变量在发送后为空。 以下是一些代码示例:

小部件.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();

非常感谢您对此提供的帮助。注意:如果我做错了整个方法并且应该做一些完全不同的事情,那么告诉我!

【问题讨论】:

QObject::connect(duff,SIGNAL(mySignal(QVariant)),buff,SLOT(myreciever(QVariant))); - 你为什么使用 QVariant 而不是 QStringList? @demonplus 抱歉打错了。 我看不出这段代码有什么明显错误,damount 是否大于零? 您的代码绝对错误,您似乎对信号和插槽缺乏了解。请重新阅读文档或一些 Qt 书籍。你用这个完全错误。这不能只用一个答案来解释。 @cmannett85 "damount" 始终是我期望的值,但感谢您的建议。 【参考方案1】:

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

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

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

mDialog 不是您连接的mysaver 实例。

【讨论】:

这是正确的解决方案,一切都按我的需要工作。感谢您的耐心等待。【参考方案2】:

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

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

您将在编译时检查类型。

【讨论】:

然而,不幸的是,有时新语法比旧的SIGNALSLOT 困难得多.. 感谢您的建议。关于 QVariant 的问题是一个错字,我很抱歉。我尝试使用您的语法建立连接,但 QStringList "aList" 仍然为空。

以上是关于使用信号和槽在类之间发送 QStringList的主要内容,如果未能解决你的问题,请参考以下文章

信号和槽Qt

QT的信号和槽

初见QT---信号和槽

信号和槽

Qt中多个对话框之间的通信,使用信号和槽或引用

QT-自定义信号和槽