2013-08-26 2 views
11

Я работаю над проектом, которому нужно вызвать модальное окно с панелью инструментов, чтобы выполнить некоторую работу над некоторыми данными до их загрузки. Причина, по которой мне нужна панель инструментов, состоит в том, что у пользователя есть несколько различных возможных вариантов, которые можно комбинировать.Можете ли вы добавить панель инструментов в QDialog?

Очевидным выбором здесь является модальный диалог (который я сейчас работаю). Проблема в том, что я хочу панель инструментов. Это вопрос в две части:

  1. Возможно ли добавить панель инструментов к QDialog? (также возможно это сделать в Qt Designer?)
  2. Если 1. невозможно, как я могу сделать QMainWindow?

ответ

5

Если вам не нужна встроенная функция перетаскивания панелей инструментов QMainWindow, вы можете просто добавить QToolBar в любой макет, включая макет QDialog(). См. Ниже DigviJay Patil's answer, что, безусловно, является более понятным концептуально.

В противном случае, пожалуйста, прочитайте.


  1. Это не непосредственно можно добавить QToolBar к QDialog в QMainWindow :: addToolBar() смысле, потому что QDialog наследует только QWidget и не QMainWindow, как вы отметили (и, следовательно, не есть метод addToolBar())

  2. вы не можете сделать QMainWindow модальность, но вы можете вставить QMainWindow в виде QDialog таким образом:

Код:

MyDialog::MyDialog() : 
    QDialog() 
{ 
    QMainWindow * mainWindow = new QMainWindow(); // or your own class 
                // inheriting QMainWindow 

    QToolBar * myToolBar = new QToolBar(); 
    mainWindow->addToolBar(myToolBar); 

    QHBoxLayout * layout = new QHBoxLayout(); 
    layout->addWidget(mainWindow); 
    setLayout(layout); 
} 

Действительно, QMainWindow не обязательно должен быть виджет верхнего уровня, и вы даже можете вставить несколько QMainWindow сек, как дети одного виджета (не может быть самый мудрый выбор, поскольку пользователь, вероятно, будет путать с отдельными наборами меню, панелями инструментов, виджетами док-станции и т. д.).

+1

Следующий вопрос должен быть: это лучшая практика в моей ситуации? Я предполагаю, что мне придется вручную построить Qmainwindow без удобства дизайнера Qt? – John

+1

Я никогда не использовал Qt Designer: нельзя ли графически вставлять QMainWindow внутри другого виджета? Во всяком случае, еще один вариант - использовать вертикальный макет с двумя виджетами: сверху QToolBar, а внизу - все, что вам нужно, как «центральный виджет». Опять же, это выполнимо наверняка вручную, но, возможно, Qt Designer предотвращает возможность использования QToolBar вне QMainWindow.Но будьте осторожны, из документации: 'Когда QToolBar не является дочерним элементом QMainWindow, он теряет способность заполнять расширение, добавив виджеты, добавленные на панель инструментов, с помощью addWidget().' – Boris

+0

Это сработало, пришлось удалить и чтобы заставить его выглядеть правильно, но это кажется быстрым. Благодарю. – John

22

Вы можете просто использовать функцию setMenuBar менеджера компоновки, который установлен на вашем QDialog:

myDialog->layout()->setMenuBar(myMenuBar); 
+2

Это должно быть ответом .... – snb

5

Вы можете добавить QToolBar в QDialog. Но как QWidget. Пожалуйста, посмотрите

MyDialog::MyDialog(QWidget *parent) : QDialog(parent) 
{ 
    QVBoxLayout *mainLayout = new QVBoxLayout(this); 

    QToolBar *toolBar = new QToolBar(); 
    mainLayout->addWidget(toolBar); 

    QAction *action1 = new QAction("Add", toolBar); 
    QAction *action1 = new QAction("Del", toolBar); 

    //Add What you want 
} 

Как QToolBar является ребенок QWidget мы можем добавить его в качестве виджета. Используя Layout, вы можете отрегулировать свое положение. Пожалуйста, проверьте эту ссылку http://developer.nokia.com/community/wiki/How_to_use_QToolBar_and_QToolButton_in_Qt

+1

Это правильный подход imo, вместо использования целого 'QMainWindow' исключительно для этой цели – manatttta