2009-11-06 2 views
1

мне удалось получить QPushButton, чтобы открыть новое окно при нажатии, используя следующий код (только фрагменты кода):Qt открывается диалоговое окно, в том же самом окне

AppDialog::AppDialog(QWidget *parent) 
     : QDialog(parent) 
{ 
    QPushButton *button3 = new QPushButton(tr("Apps")); 
    QHBoxLayout *hLayout = new QHBoxLayout; 
    hLayout->addWidget(button3); 
    setLayout(hLayout); 
} 


MainWindow::MainWindow() 
{ 
mainMenu = new MainMenu; 
setCentralWidget(mainMenu); 

app = 0; 
readSettings(); 
} 


void MainWindow::AppMenu() 
{ 
    app = new AppDialog(this); 
    app->show(); 
} 

Откроется в новом окне с Кнопка «Приложение» в нем. Может ли кто-нибудь сообщить мне, если это возможно, и как открыть диалоговое окно нового приложения в том же окне, что и исходное главное меню? Он должен охватывать все окно и выглядеть как обычное окно с новым меню на нем. В идеале после этого я мог бы добавить кнопку «назад». Я предполагаю, что это похоже на создание интерфейса «мастера», который много используется для мастеров установки и тому подобного.

Bryce

РЕДАКТИРОВАТЬ

Это исходный код для реализации QStackedWidgets()

MainMenu::MainMenu(QWidget *parent) 
     : QDialog(parent) 
{ 
    QStackedLayout *stackedLayout = new QStackedLayout; 

    AppDialog *app = new AppDialog; 
    progWidget *program = new ProgWidget; 

    QStackedWidget *stackedWidget = new QStackedWidget; 
    stackedWidget->addWidget(app); 
    stackedWidget->addWidget(program); 

    stackedWidget->setCurrentIndex(0); 

    QVBoxLayout *vLayout = new QVBoxLayout; 
    vLayout->addWidget(stackedWidget); 

    setLayout(vLayout); 
} 

Где бы я поставил сигналы и слоты для изменения индекса? Отображение того, что виджеты приложений и программ - это всего лишь несколько виджетов с некоторыми QPushButtons. Я могу заставить их отображать отдельно, но не знаю, как их изменить.

ответ

3

Возможно, вы захотите посмотреть this question. Мой ответ здесь тот же ... используйте QStackedWidget как ваш главный виджет, и материал, который вы хотите быть другим на каждой странице внутри него. (Если это все диалоговое окно, сделайте сложный виджет, охватывающий весь диалог). Затем вы можете установить текущую страницу сложного виджета на основе любой логики, которую хотите использовать, например, нажать кнопку, и она скроет все с предыдущей страницы и покажет новую текущую страницу.

== EDIT ==

Для уточнения на основе вашего примера, вы могли бы сделать что-то вроде этого:

enum Pages { FIRST, SECOND, LAST }; 

MainMenu::MainMenu(QWidget *parent) 
     : QDialog(parent) 
{ 
    // Create widgets to populate the pages 
    QWidget* widgets[3]; 
    widgets[FIRST] = new QWidget; 
    widgets[SECOND] = new QWidget; 
    widgets[LAST] = new QWidget; 

    // Create buttons to navigate between the pages 
    QPushButton* buttons[3]; 
    buttons[FIRST] = new QPushButton(widgets[FIRST]); 
    buttons[FIRST]->setText("Next"); 
    buttons[FIRST]->setSize(100, 100); 
    buttons[FIRST]->show(); 

    buttons[SECOND] = new QPushButton(widgets[SECOND]); 
    buttons[SECOND]->setText("Next"); 
    buttons[SECOND]->setSize(100, 100); 
    buttons[SECOND]->show(); 

    buttons[LAST] = new QPushButton(widgets[LAST]); 
    buttons[LAST]->setText("Start Again"); 
    buttons[LAST]->setSize(100, 100); 
    buttons[LAST]->show(); 

    // Create stacked widget for the pages 
    QStackedWidget *stackedWidget = new QStackedWidget; 
    stackedWidget->addWidget(widgets[FIRST]); 
    stackedWidget->addWidget(widgets[SECOND]); 
    stackedWidget->addWidget(widgets[LAST]); 

    stackedWidget->setCurrentIndex(0); 

    QVBoxLayout *vLayout = new QVBoxLayout; 
    vLayout->addWidget(stackedWidget); 

    setLayout(vLayout); 

    // Changes a bunch of signals into one signal with an index. 
    QSignalMapper *mapper(this); 
    for(int i = 0; i < 3; ++i) 
    { 
     // Each button maps to the next id, with the last one wrapping around. 
     mapper->setMapping(buttons[i], (i + 1) % 3); 
     // Make the button click connect to the mapper. 
     connect(buttons[i], SIGNAL(clicked()), mapper, SLOT(map())); 
    } 
    // Connect the collected (and slightly transformed) signal to change the page. 
    connect(mapper, SIGNAL(mapped(int)), stackedWidget, SLOT(setCurrentIndex(int))); 
} 
+0

Это похоже на точный ответ на мою проблему. Теперь, как я могу это реализовать. Пример в программировании на C++ GUI с Qt4, а также в документации не распространяется далеко за рамки базовой реализации. Как добавить изображения или тест или кнопки в каждый QStackedWidget? – bryce

+0

@bryce: Если вы используете дизайнера, это довольно просто. Если вы добавляете через код напрямую, вам нужно сделать виджет для каждой страницы сложного виджета. Добавьте объекты на соответствующую страницу, как если бы вы добавляли их в главный виджет. Затем добавьте каждую страницу в сложный виджет. Обратите внимание, что вам нужен только один сложный виджет с несколькими страницами в виджетах. –

+0

Ок, спасибо, я прямо кодирую это, так что нет дизайнера. Попробуй свои предложения и сообщите, как это происходит, это выглядит очень многообещающе. – bryce

1

Не подкласс QDialog. Просто создайте новый QWidget, настройте его и замените виджет, который вы хотите с ним. Таким образом, кнопка «назад» тривиальна: просто замените другую.

Вы также можете позвонить по телефону QMainWindow::setCentralWidget(), если это уместно.

+0

Так что было бы что-то вроде MainMenu :: AppDialog (QWidget * родителю) : QDialog (родитель) Это на правильном пути? – bryce

+0

'QDialog' создает для себя новое окно. Вероятно, вы хотите что-то вроде 'AppDialog (QWidget * parent): QWidget (parent)'. –

+0

Да, спасибо, что работал по большей части. Теперь у меня есть новая кнопка, которая появляется в окне, но остальные кнопки остаются там, где они есть. Использую ли я что-то вроде delete, чтобы избавиться от старых кнопок? – bryce

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