2013-02-14 75 views
0

我從其他表單需要的(WorkersList)返回一些值的Qt4,這些表單將調用WorkersList,然後WorkerList將傳回值取決於使呼叫。爲了從WorkersList傳回值給調用者,我要實現爲每個這樣的形式是這樣的方法:如何投射一個指向Qt4表格的指針

僞代碼:

class WorkersList : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit WorkersList(QWidget *parent = 0); 
    void getWorkersList(); 
    void setWorkerForm(Ui::WorkerMod *workerMod); // The method to pass back to the caller 1 
    void setWorkerForm2(Ui::WorkerDel *workerDel); // The method to pass back to the caller 2 
    void setSuspendForm(Ui::WorkerSuspend *worker); // The method to pass back to the caller 3 
    void setResumeForm(Ui::WorkerResume *worker); // The method to pass back to the caller 4 
    ~WorkersList(); 

private: 
    Ui::WorkersList *ui; 
    Ui::WorkerMod *workerForm; 
    Ui::WorkerDel *workerForm2; 
    Ui::WorkerSuspend *workerSuspendForm; 
    Ui::WorkerResume *workerResumeForm; 
    QStringList infoWorker; 
}; 

有沒有一種方法,使我有僅實現一個方法,通過呼叫者作爲參數,以及從該方法我提出的投給調用者是這樣的:

class WorkersList : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit WorkersList(QWidget *parent = 0); 
    void getWorkersList(); 
    void setForm(void *from, int caller); 
    ~WorkersList(); 

private: 
    Ui::WorkersList *ui; 
    Ui::WorkerMod *workerForm; 
    Ui::WorkerDel *workerForm2; 
    Ui::WorkerSuspend *workerSuspendForm; 
    Ui::WorkerResume *workerResumeForm; 
    QStringList infoWorker; 
}; 

... 

void WorkersList::setForm(void *form, int caller) 
{ 
    if(caller == 0) 
     workerForm = (Ui::WorkerMod *)form; 
    else if(caller == 1) 
     workerForm2 = (Ui::WorkerDel *)form; 
    else if(caller == 2) 
     workerSuspendForm = (Ui::WorkerSuspend *)form; 
    else if(caller == 3) 
     workerResumeForm = (Ui::WorkerResume *)form; 

} 

UPDATE

我嘗試這樣做:

void WorkersList::setForm(QObject *obj, int form) 
{ 
    if(form == 0) 
    { 
     this->workerAbsenceForm = qobject_cast<Ui::AbsenceAdd *>(obj); 
    } 
    if(form == 1) 
    { 
     this->workerAbsenceForm3 = qobject_cast<Ui::AbsenceMod >(obj); 
    } 
} 

編譯器生成的錯誤:

/usr/local/include/qt4/QtCore/qobject.h: In function 'T qobject_cast(QObject*) [with T = Ui::AbsenceAdd*]': 
workerslist.cpp:259: instantiated from here 
/usr/local/include/qt4/QtCore/qobject.h:378: error: 'class Ui::AbsenceAdd' has no member named 'qt_check_for_QOBJECT_macro' 
/usr/local/include/qt4/QtCore/qobject.h:380: error: 'class Ui::AbsenceAdd' has no member named 'staticMetaObject' 

而其他提示我想:

void WorkersList::setForm(void *obj, int form) 
{ 
    if(form == 0) 
    { 
     this->workerAbsenceForm = (Ui::AbsenceAdd *)obj; 
    } 
    if(form == 1) 
    { 
     this->workerAbsenceForm3 = (Ui::AbsenceMod *)obj; 
    } 
} 

它編譯,但是GUI一直沒有露面向上。

回答

1

如果所有這些表單都繼承QWidget,則可以使用傳遞給setForm()方法的參數的元對象信息。

void WorkerList::setForm(QWidget* form) 
{ 
    if (!form) 
    return; 

    const QString name = form->metaObject()->className(); 

    if (QString::fromUtf8("WorkerMod") == name) 
    workerForm = qobject_cast<WorkerMod*>(form); 

    ... 
}