使用Qt Designer通过其他菜单扩展QMainWindow的现有UI

时间:2014-12-04 10:54:43

标签: c++ qt

我使用Qt和C ++编写了一个基本的图像查看应用程序,即我有一个类

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,我将[{1}}的{​​{1}}扩展到包含QMenuBar s的其他ImageViewApp目的,说图像注册。此外,我还想更改其他一些内容,例如QMenu并将QAction添加到windowTitle的现有QAction

我正在寻找一种方式,我不需要触摸或复制QMenu的.ui文件。我想做一些类似继承的事情,ImageViewApp的UI更改会影响ImageViewApp的用户界面。我还希望能够通过Qt Designer为ImageViewApp创建和编辑其他ImageRegistrationAppQMenu

这可能吗?

更新

我尝试更改ImageRegistrationApp的标题,并通过C ++中的继承向QAction中的现有ImageRegistrationApp添加QAction,如下所示:

QMenu

我还将ImageViewApp中的继承更改为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!" ); } }; ,以便能够访问Ui元素。

ImageViewApp的标题按预期更改,protected Ui::ImageViewer ImageRegistrationApp显示在菜单QAction中,但是当我点击它时,虽然我预计没有任何反应它显示Test Tools中定义的QMessageBox

还有什么我需要做的,将slot与插槽连接起来吗? 我试过on_actionTest_triggered,但这并没有改变任何事情。

1 个答案:

答案 0 :(得分:0)

触发QAction actionTest时插槽未执行的问题是拼写错误。我之前也曾尝试过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添加到相应的QMenu。除了使用Qt Designer设计其他QMenu之外,此方法应该能够满足我在问题中要求的所有内容。相反,一切都必须用C ++源代码编写。