我认为我遇到了一些麻烦:我有一个QMainWindow课程。在我的程序中,我想创建其他类,例如用于输入处理,计算......
现在我首先从我的mainwindow类发送到我的fileselector(文件处理程序)类来打开文件对话框,从而在内部保存所选文件。不幸的是我连接插槽时遇到了麻烦。
主窗口:
MA_FEX::MA_FEX(QWidget *parent)
: QMainWindow(parent), fileSelector(this)
{
ui.setupUi(this);
//this works:
fileSelector.openFiles(this);
//this doesn't:
connect(ui.actionOpenFiles, SIGNAL(triggered()), fileSelector, SLOT(openFiles(this)));
}
MA_FEX::~MA_FEX()
{
}
mainwindow标题:
class MA_FEX : public QMainWindow
{
Q_OBJECT
public:
MA_FEX(QWidget *parent = 0);
~MA_FEX();
private:
Ui::MA_FEXClass ui;
FileSelection fileSelector;
};
文件协调类:
FileSelection::FileSelection(QObject *parent)
: QObject(parent)
{
}
FileSelection::~FileSelection()
{
}
void FileSelection::openFiles(QWidget *parent){
QStringList files = QFileDialog::getOpenFileNames(
parent,
"Select one or more files to open",
"c:",
"Images (*.csv *.txt )");
}
头:
class FileSelection : public QObject
{
Q_OBJECT
public:
FileSelection(QObject *parent);
~FileSelection();
public slots:
void openFiles(QWidget *parent);
private:
};
我错过了什么吗?在连接线上执行i得到错误C2664,说参数3'FileSelection'无法转换为'const QObject'。
答案 0 :(得分:1)
查看QObject::connect
:
QObject::connect(const QObject * sender, const char * signal,
const QObject * receiver, const char * method,
Qt::ConnectionType type = Qt::AutoConnection);
它需要指针,因此您需要将指针传递给fileSelector
。
另一个问题是SIGNAL和SLOT不兼容。 connect中的插槽规范是声明,因此您不能像使用this
那样传递参数。如果使用Qt 5和C ++ 11,则可以通过传递lambda而不是slot规范来实现:
QObject::connect(ui.actionOpenFiles, &QAction::triggered,
[this]() { fileSelector.openFiles(this); });
对于Qt 4,你需要在你的MA_FEX
类中创建一个不带参数的包装槽,它将调用fileSelector
的插槽:
class MA_FEX {
...
Q_SLOT void openFileSelector() { fileSelector.openFiles(this); }
...
public:
MA_FEX(QWidget *parent) : QMainWindow(parent), fileSelector(this) {
ui.setupUi(this);
connect(ui.actionOpenFiles, SIGNAL(triggered()), SLOT(openFileSelector()));
}
...
};