2014-03-03 43 views
0

我想我有一些麻烦得到这个权利:我有一个QMainWindow类。在我的程序中,我想创建其他类,例如输入处理,计算...QT类之间的连接

现在首先从我的主窗口类,我想发送到我的文件选择器(文件处理程序)类打开文件对话框,从而在内部保存选定的文件。不幸的是我有麻烦连接插槽。

主窗口:

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() 
{ 
} 

主窗口标题:

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: 

}; 

我错过了什么吗?执行我得到连接线上的错误C2664,说参数3'FileSelection'不能转换为'const QObject'。

回答

1

看那QObject::connect声明:

QObject::connect(const QObject * sender, const char * signal, 
       const QObject * receiver, const char * method, 
       Qt::ConnectionType type = Qt::AutoConnection); 

它采用指针,所以你需要一个指针传递给fileSelector

另一个问题是信号和SLOT不兼容。 connect中的插槽规范是声明,因此不能像在this中那样传递参数。如果您使用Qt 5和C++ 11,你可以做到这一点通过将lambda而非插槽规格:

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())); 
    } 
    ... 
}; 
+0

感谢约翰尼和库巴,我使用QT5和C++ 11作为我确实想避免缠绕槽溶液选择的第一个版本。 – refuzee