我使用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
创建和编辑其他ImageRegistrationApp
和QMenu
。
这可能吗?
更新:
我尝试更改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
,但这并没有改变任何事情。
答案 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 ++源代码编写。