连接2个不同类的信号(Qstring)whit slot(String)

时间:2018-06-14 11:04:51

标签: c++ qt signals slot

我有2个类:Class MaFentre和Code

code.h:

class Code : public QObject {

public :


explicit  Code(Q3DScatter *scatter);

    public slots:
 std::vector<point> readingData(std::string inputFileName);
}

MaFenetre.h:

class MaFenetre : public QWidget
{  Q_OBJECT
    public:
MaFenetre();
    private:
    QLineEdit *entry1;
}

Code.cpp:

std::vector<point> Code::readingData(std::string inputFileName){
// i read a file here
}

我在MaFenetre类的构造函数中创建了Code类对象

    Code *modifier = new Code(graph);

用于在插槽和信号之间建立连接

QObject::connect(entry1, SIGNAL(textChanged(QString)),modifier, SLOT(readingDara(std::string inputFileName)))

我知道参数必须是相同的类型,因为我尝试编码:

    QObject::connect(entry, SIGNAL(textChanged(QString.toStdString)),modifier, SLOT(readingDara(std::string inputFileName)))

但它不起作用

2 个答案:

答案 0 :(得分:1)

您的信号和插槽参数不兼容。

您可以使用lambda功能

执行此解决方法
 Code *modifier = new Code();
 MaFenetre * poMaFenetre = new MaFenetre();

 connect(poMaFenetre->Entry(), &QLineEdit::textChanged,
         [modifier](const QString & oText)
 {
     std::vector<int> data = modifier->readingData(oText.toStdString());
     // Handle data here...
 });

MaFenetre

class MaFenetre : public QWidget
{
    Q_OBJECT
    public:
    MaFenetre() {entry1.reset(new QLineEdit());}
    QLineEdit *Entry() {return entry1.data();}
    private:
    QScopedPointer<QLineEdit> entry1;
};

答案 1 :(得分:0)

使用信号和插槽与调用函数和传递参数不同。

首先,信号和插槽必须具有相同的参数类型,这意味着它们必须使用相同的参数进行定义。在您的情况下,您必须更改您的插槽以适应可能的信号。另请注意,在插槽调用的情况下,返回值是无用的,因此更好的方法是让您按原样读取函数,将其移动到私有区域,并创建包装器插槽:

void Code::readingDataSlot(QString inputFileName)
{
    std::vector<point> result = readingData( inputFileName.toStdString() );
    // Do what ever you need with result vector
}

并将其连接到信号。

connect(entry1, SIGNAL(textChanged(QString)),modifier, SLOT(readingDataSlot(QString)));