2014-03-03 72 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