我有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)))
但它不起作用
答案 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)));