QT课程之间的连接

时间:2014-03-03 15:08:45

标签: c++ qt signals-slots

我认为我遇到了一些麻烦:我有一个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'。

1 个答案:

答案 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()));
  }
  ...
};