使用信号和槽在 类 之间发送 QStringList
Sending QStringList between classes using signals and slots
我有一个使用 QT Creator 构建的 GUI。在某个时候打开了一个对话框 window,我需要向其中发送一个 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();
}
我非常感谢对此提供一些帮助。注意:如果我整个方法都做错了,应该做一些完全不同的事情,请告诉我!
显然您使用的是 QVariant 而不是 QStringList,并且没有编译时检查。最好以这种方式进行连接:
QObject::connect(duff, &Widget::mySignal, buff, &mysaver::myreciever);
您将在编译时检查类型。
您正在创建两个 mysaver
个实例并且只连接到第一个(不可见的)实例:
// In main.cpp
mysaver *buff = new mysaver;
// In Widget::on_pushButton_4_clicked()
mysaver mDialog;
mDialog.setModal(true);
mDialog.exec();
mDialog
不是您连接的 mysaver
实例。
我有一个使用 QT Creator 构建的 GUI。在某个时候打开了一个对话框 window,我需要向其中发送一个 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();
}
我非常感谢对此提供一些帮助。注意:如果我整个方法都做错了,应该做一些完全不同的事情,请告诉我!
显然您使用的是 QVariant 而不是 QStringList,并且没有编译时检查。最好以这种方式进行连接:
QObject::connect(duff, &Widget::mySignal, buff, &mysaver::myreciever);
您将在编译时检查类型。
您正在创建两个 mysaver
个实例并且只连接到第一个(不可见的)实例:
// In main.cpp
mysaver *buff = new mysaver;
// In Widget::on_pushButton_4_clicked()
mysaver mDialog;
mDialog.setModal(true);
mDialog.exec();
mDialog
不是您连接的 mysaver
实例。