如何在Qt C++中单击菜单栏中的元素时打开新的QDailog窗口

How to open a new QDailog window when an element in the menu bar is clicked in Qt C++

本文关键字:窗口 QDailog 元素 菜单栏 Qt C++ 单击      更新时间:2023-10-16

Material类有一个带菜单栏的主窗口。当我点击菜单栏中的一个元素时,我想打开小说Q对话框窗口。material.h

#ifndef MATERIALS_H
#define MATERIALS_H
#include <QMainWindow>
#include "materialinner.h"
class FictionSection;
namespace Ui {
class Materials;
}
class Materials : public QMainWindow, public MaterialInner
{
    Q_OBJECT
public:
    explicit Materials(QWidget *parent = 0);
    ~Materials();
private:
    Ui::Materials *ui;
    FictionSection *fiction;
};
#endif // MATERIALS_H

materials.cpp

#include "materials.h"
#include "ui_materials.h"
#include "fictionsection.h"
#include <QDebug>
#include <QMessageBox>
Materials::Materials(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Materials)
{
    ui->setupUi(this);
 // connect(ui->ficti,SIGNAL(textChanged(const QString &)),this,SLOT(displaySearch()));
}
Materials::~Materials()
{
    delete ui;
}
void Materials::on_actionFiction_section_triggered()
{
    this->hide();
     fiction = new FictionSection();
    fiction->show();
}

第h节

#ifndef FICTIONSECTION_H
#define FICTIONSECTION_H
#include <QDialog>
#include "materials.h"

namespace Ui {
class FictionSection;
}
class FictionSection : public QDialog, public Materials
{
    Q_OBJECT
public:
    explicit FictionSection(QWidget *parent = 0);
    ~FictionSection();
private:
    Ui::FictionSection *ui;
};
#endif // FICTIONSECTION_H

当我编译时,它会给出一个错误对成员"show"的请求不明确请帮我解决这个问题。提前谢谢。

问题是FictionSection类继承自QDialogMaterials,但Materials类也继承自QMainWindowQMainWindowQDialog都有一个虚拟的show()方法(继承自QWidget),这导致了歧义。换句话说:您打算调用QMainWindow::show的实现还是QDialog::show的实现?没有人知道。

要解决此问题,您应该正确使用继承。从QMainWindowQDialog继承,但不能同时继承

您需要理解为什么是您继承了现有的方式(这是错误的),并改进类之间关系的逻辑,以避免类似这样的问题。

另外,类名应该是单数,所以Materials应该是Material。如果它需要处理多个事情,那么它可以是MaterialManager或类似的东西。