2013-10-02 2 views
1

Я начинающий на C++, и я начал изучать, как использовать компоненты QT через код в MVS IDE. Я все еще не знаю, было ли это наилучшим вариантом, но поскольку я программист на Java, я сделал путь, который я создал с Java (компоненты Swing). Итак, моя проблема заключается в том, как связать два класса моего кода, так как в одном я сделал оконный фрейм, а в другом я сделал свой бар меню?Как добавить панель меню в рамку окна? [QT с C++]

В Java я хотел бы сделать что-то вроде:

JFrame frame = new JFrame(); 
JMenu menu = new JMenu(); 

frame.add(menu); 

Во всяком случае, это мой код:

#include "Header.h" 

class MainWindow{ 

    private: 

     QWidget *widget; 

    public: 

     void buildWindow(QApplication& app){ 

      widget = app.desktop(); 
      QMainWindow *main_window = new QMainWindow(); 
      QWidget *mainWid = new QWidget(main_window); 
      MyMenuBar myMenuBar(mainWid); 
      main_window->setWindowState(mainWid->windowState() | Qt::WindowMaximized); 
      main_window->setWindowTitle("QT Trainning"); 
      main_window->show();    
     } 

}; 

class MyMenuBar:QMainWindow { 

    public: 

    MyMenuBar(QWidget* mainWid){ 

     QAction *quit = new QAction("&Quit", this); 

     QMenuBar *menu = new QMenuBar(mainWid); 
     QMenu *file; 

     menu->addMenu(file); 
      file = menuBar()->addMenu("&File"); 
      file->addAction(quit); 

      connect(quit, SIGNAL(triggered()), qApp, SLOT(quit())); 
    } 

}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    MainWindow frame; 

    frame.buildWindow(app); 

    return app.exec(); 
} 

I судимым, чтобы создать экземпляр MenuBar внутри класс окна, но wans't так полезно и, честно говоря, большинство материалов, которые я нашел для работы с QT-интерфейсом, они полагают, что вы используете QT GUI ... Любые советы о том, как решить проблему или что я должен делать, чтобы практиковать C++?

Заранее спасибо

ответ

3

Вы должны указать спецификатор доступа для наследования, режим в противном случае по умолчанию является публичным.

Кроме того, если вы собираетесь иметь все классы в одном файле, заказ имеет важное значение (я думаю). В вашем случае MyMenuBar должен появиться перед MainWindow. Таким образом, лучше использовать разные компоненты в разных заголовках, а затем включать их по мере необходимости.

Вот код для случая, когда вам нужно два класса по отдельности:

class TrainingMenu:public QMainWindow { 

public: 

     TrainingMenu(QMenuBar *menubar){ 
      QAction *quit = new QAction("&Quit", menubar); 

      QMenu *file; 

      file = menubar->addMenu("&File"); 
      file->addAction(quit); 

      connect(quit, SIGNAL(triggered()), qApp, SLOT(quit())); 
     } 

}; 

class MainWindows:public QMainWindow{ 

private: 
    TrainingMenu* _menu; 
public: 
    MainWindows(QMainWindow *parent = 0):QMainWindow(parent) { 
     _menu=new TrainingMenu(MainWindows::menuBar()); 
     this->setWindowTitle("Qt training"); 
     this->setWindowState(Qt::WindowMaximized); 
     this->show(); 
    } 

}; 



int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindows window; 

    return app.exec(); 
} 
+0

Прежде всего, извините за задержку ответить, Wanst, имея время в те дни, чтобы изучить C++. во всяком случае, ответ был потрясающим, работает как шарм. Теперь я понимаю, что «родительский» - главный указатель приложения QT, и для каждого компонента, который я хотел бы создать, мне нужно определить его внутри основного фрейма или виджета приложения, оттуда уступить и перейти к его класс для обработки. Большое спасибо. ps: исправьте меня, если я понял неправильно –

2

This пример должен быть достаточно хорошо. Вы делаете следующее:

  • Создать QMenu с верхним виджетом как родитель
  • Добавить подменю QMenu экземпляров в меню корневого уровня
+0

Код полезным в простой способ развить то, что я хочу, но оленья кожа отвечает на знания, которые я хочу =/Я все еще могу 't обрабатывать, как это сделать, используя два разных класса. –

Смежные вопросы