2014-12-04 27 views
1

附加菜單我已經寫了基本圖像查看使用Qt和C++應用程序,即我有一個類延長的QMainWindow現有UI通過使用Qt Designer

ImageViewApp : public QMainWindow, private Ui::ImageViewer { 
    Q_OBJECT 
public: 
    ImageViewApp (const char * InputFilename = NULL) { 
    setupUi (this); 
    } 
}; 

與Qt Designer創建一個的.ui文件,其生成限定

class Ui_ImageViewer { 
public: 
    void setupUi(QMainWindow *ImageViewer) { … } 
}; 

namespace Ui { 
    class ImageViewer: public Ui_ImageViewer {}; 
} // namespace Ui 

現在我想寫另一應用ImageRegistrationApp,其中I通過含有QAction期附加QMenu小號延伸的ImageViewAppQMenuBar頭文件出於某種目的,比如圖像註冊。此外,我想改變一些其他的東西,如windowTitle,並將QAction加到現有的QMenus的ImageViewApp

我正在尋找一種方法,我不需要觸摸或複製ImageViewApp的.ui文件。我想做一些類似繼承的事情,其中​​對ImageViewApp的UI的更改會影響ImageRegistrationApp的UI。另外我希望能夠通過Qt Designer爲ImageRegistrationApp創建和編輯附加的QMenuQAction

這可能嗎?

UPDATE

我試圖改變ImageRegistrationApp的標題和內C++通過繼承添加QAction到現有QMenuImageViewApp如下:

ImageRegistrationApp : public ImageViewApp { 
    Q_OBJECT 
public: 
    QAction *actionTest; 

ImageRegistrationApp (const char * InputFilename = NULL) 
    : ImageViewApp (InputFilename) { 
    this->setWindowTitle(QApplication::translate("ImageViewer", "ImReg", 0, QApplication::UnicodeUTF8)); 
    actionTest = new QAction(this); 
    actionTest->setObjectName(QString::fromUtf8("actionTest")); 
    actionTest->setText(QApplication::translate("ImageViewer", "Test", 0, QApplication::UnicodeUTF8)); 
    this->menuTools->addAction(actionTest); 
} 

protected slots: 
    void on_actionTest_triggered() { 
    QMessageBox::information(NULL, "Test", "Hello world!"); 
    } 
}; 

我也改變了繼承在ImageViewAppprotected Ui::ImageViewer以便能夠訪問UI元素。

如預期,也是QActionTest顯示了在菜單Tools,但是當我點擊它,什麼都不會發生,雖然我希望它顯示QMessageBox作爲sloton_actionTest_triggered定義我ImageRegistrationApp標題更改。

還有什麼我必須做的,連接QAction插槽? 我試過QObject::connect(actionTest, SIGNAL(triggered()), this, SLOT(actionTest));但這並沒有改變任何東西。

+0

這是可能的,但通過C++代碼更簡單。 – 2014-12-04 10:59:50

+0

使用Qt Designer的可能性是什麼樣子? – user1192038 2014-12-04 11:19:53

+0

是的。如果你有複雜的菜單,你應該寫一個「菜單管理器」來實現你所有的邏輯。 – 2014-12-04 11:22:03

回答

0

觸發時未執行插槽的問題是拼寫錯誤。之前我也試過QObject::connect(actionTest, SIGNAL(on_triggered()), this, SLOT(on_actionTest_triggered));,但最後還是沒有()

添加在ImageRegistrationApp構造的端部的下面的行解決了這個問題:

QObject::connect(actionTest, SIGNAL(on_triggered()), this, SLOT(on_actionTest_triggered())); 

實例化ImageRegistrationApp現在實例化的ImageViewApp整個GUI並添加另外定義QAction s到相應QMenu秒。除了使用Qt Designer設計額外的QMenus之外,這種方法應該能夠滿足問題中所要求的所有內容。相反,所有東西都必須用C++源代碼進行編碼。