C++ Qt/C++;-从派生类调用重写的方法
我有以下代码:C++ Qt/C++;-从派生类调用重写的方法,c++,qt,overriding,C++,Qt,Overriding,我有以下代码: void AppMPhase::closeEvent(QCloseEvent *closeEvent) { QMessageBox* dialog = new QMessageBox(this); dialog->setText("Warning: Initial configuration changed\nDo you want to restore it ?"); dialog->setIcon(QMessageBox::Warning)
void AppMPhase::closeEvent(QCloseEvent *closeEvent) {
QMessageBox* dialog = new QMessageBox(this);
dialog->setText("Warning: Initial configuration changed\nDo you want to restore it ?");
dialog->setIcon(QMessageBox::Warning);
dialog->addButton(QMessageBox::Yes);
dialog->addButton(QMessageBox::No);
connect(dialog, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(restoreInitialConfig(QAbstractButton*)));
dialog->exec();
}
void AppMPhase::restoreInitialConfig(QAbstractButton *button) {
if(!button->text().compare(QString("Yes"))) {
// restore Config
}
else {
// don't restore
}
MainWindow::closeEvent(closeEvent);
}
使用app强调主窗口的派生类
我想在“restoreInitialConfig”方法中调用基类MainWindow的closeEvent方法,以便在恢复配置后关闭窗口。
可能吗?这与我看到的其他问题不同,因为方法closeEvent在AppMpasse类中被重写
AppPase类:
class AppMPhase : public QtUi::MainWindow
{
Q_OBJECT
public:
AppMPhase(QWidget *const parent = Q_NULLPTR, const Qt::WindowFlags flags = 0);
~AppMPhase();
int readConfigFromExternFile(QString path);
int readCalibrationDate(QString path);
QSize sizeHint() const Q_DECL_OVERRIDE;
QtWrapperTestManager * testManager;
public Q_SLOTS:
void show();
public slots:
void currentTestFinished();
void createTest(unsigned int,QString);
void restoreInitialConfig(QAbstractButton* button);
signals:
void notifyPageTestCurrentTestFinished();
private:
enum AppPage
{
PAGE_START,
PAGE_ABOUT
};
bool isTestMangaerCreated;
std::map<QString, std::map<std::string, std::string> > conversion_Table_Cable_Ref_sensorParamMap;
Pages::GenericAppPage * appPage(const int index) const;
QToolButton * appPageButton(const int index) const;
virtual void closeEvent(QCloseEvent *closeEvent) Q_DECL_OVERRIDE;
提前谢谢
Flo有一种更简单的方法来实现您想要做的事情,而不必使用信号和插槽,也不必从插槽调用基类函数 可以直接从
closeEvent
处理程序中执行恢复
这是因为根据按下的按钮返回与中的一个值匹配的整数代码
void AppMPhase::closeEvent(QCloseEvent* ev)
{
int res = QMessageBox(
QMessageBox::Icon::Warning,
"Restore configuration?",
"Warning: Initial configuration changed\nDo you want to restore it?",
QMessageBox::Yes | QMessageBox::No,
this).exec();
if (res == QMessageBox::Yes)
restoreInitialConfig();
MainWindow::closeEvent(ev);
}
然后,您可以从closeEvent
处理程序中直接调用restoreInitialConfig
,因为您知道按下了哪个按钮
void AppMPhase::closeEvent(QCloseEvent* ev)
{
int res = QMessageBox(
QMessageBox::Icon::Warning,
"Restore configuration?",
"Warning: Initial configuration changed\nDo you want to restore it?",
QMessageBox::Yes | QMessageBox::No,
this).exec();
if (res == QMessageBox::Yes)
restoreInitialConfig();
MainWindow::closeEvent(ev);
}
请注意,这也简化了restoreInitialConfig
功能,因为不需要检查按钮文本,您知道答案是肯定的
注意,我也利用了这一点,很容易创建简单的消息框。
你可能想看看C++中如何使用一个等价的“超级”。有关更多信息,请参阅此讨论。您根本不必调用closeEvent()
函数。继承QMainWindow
类时,只需调用其close()
插槽即可将其关闭。因此,不是MainWindow::closeEvent(closeEvent)在代码中,只需调用close()代码>。请注意,我们喜欢一个,即复制问题的代码的最小版本。这使你的问题更容易回答,对其他有同样问题的人更有用。