2015-12-05 24 views
-1

材料類具有帶菜單欄的主窗口。當我點擊菜單欄中的其中一個元素時,我想打開小說Qdialog窗口。 material.h如何在Qt中單擊菜單欄中的某個元素時打開新的QDailog窗口C++

#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(); 

} 

fictionsection.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 

當我編譯它給出了一個錯誤是 請求構件 '顯示' 是模糊。 請幫我解決這個問題。先謝謝你。

回答

2

的問題是,你的FictionSection類來自QDialogMaterials繼承,但是你Materials類也從QMainWindow繼承。 QMainWindowQDialog都有一個虛擬的show()方法(從QWidget繼承),這會導致模糊性。換句話說:你打算打電話QMainWindow::show的執行還是QDialog::show的執行?沒人知道。

要解決這個問題,您應該正確使用繼承。從QMainWindowQDialog繼承,但不能同時爲

你需要了解爲什麼它是你繼承你的方式(這是錯誤的),並改善你的類之間的關係的邏輯,以避免這樣的問題。

此外,類名稱應該是單數,所以Materials應該是Material。如果它需要處理多件事情,那麼它可能是MaterialManager或類似的東西。

+0

非常感謝。有效。非常感謝你 – user3279893

+1

@ user3279893如果它對你有幫助,將答案標記爲「已接受」,讓其他人知道這類問題的解決方案。 –

相關問題