Qt对话窗口在同一窗口中打开

时间:2009-11-06 19:43:29

标签: c++ user-interface qt

使用以下代码(只是代码片段)按下时,我设法让QPushButton打开一个新窗口:

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

这将在一个新窗口中打开,其中包含“App”按钮。任何人都可以让我知道是否可能以及如何在与原始主菜单相同的窗口中打开新的应用程序对话框?它应该覆盖整个窗口,看起来像一个普通的窗口,上面有新的菜单。理想情况下,我可以添加某种“后退”按钮。我想这类似于创建一个“向导”类型的界面,在安装向导和类似的东西上使用了很多。

布莱斯

修改

这是实现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。我可以让它们单独显示,但还没弄清楚如何更改它们。

2 个答案:

答案 0 :(得分: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)));
}

答案 1 :(得分:1)

不要继承QDialog。只需创建一个新的QWidget,进行设置,然后用它替换你想要的小部件。这样一个“后退”按钮是微不足道的:只做另一个替换。

如果合适,您也可以使用QMainWindow::setCentralWidget()致电。