Extra window or ui in existing gui

  • Hello to all,

    I would like to know how I can embed an extra window or another ui in my mainclass gui.

    I have a gui that I created with the help of the designer as main class with several elements like buttons. In this gui I need to have a frame / window / ui that can expand to fullscreen size, wenn I push a button in the outer gui. The frame / window / ui that's supposed to be shown fullscreen should contain elements a pixmap, labels and lcdnumbers.

    My approach was:

    • define a member widget in the main class
    • creating an instance widget in the constructor with a rectangle geometry, showing it

    How can I embed this window in my ui? or is something else than a window widget more useful?

  • You can create new Qt Designer Form Class and promote widgets from main ui to it.

  • p-himik, I'll try and create that class.

    once created, how can I embed it in my main ui? with a certain position etc.

    and can I let it show then with .showfullscreen() ? (only the second ui)

  • Hi Anna,

    one question:

    do you want to achieve something like in typical editors: Floating child windows that can be maximized insid ethe main window? if yes, have a look at "QMdiArea":http://doc.qt.nokia.com/latest/qmdiarea.html

  • that is not exactly what I have in mind...

    the second ui shoud be able to be maximized to fullscreen size. no matter what resolution the sreen has.
    so the ui would be the only thing to be seen.

    is that possible?

    1. Put simple QWidget on your main ui
    2. Promote it to your second ui's class (right button on the simple QWidget -> Promote to...)
    3. In the slot connected to the "Go fullscreen" button place following code (replace secondUiWidget with your's widget's object name):
      @setWindowFlags( Qt::Window );
    4. In the slot connected to button returning second ui to it's normal state you have to do the opposite (i'm not sure but i think that you'll need to restore widget's geometry too).

    I didn't test it, but i will if it won't do the job.

  • thank you, p-himik!

    creating the window and maximzing it worked perfectly :-)

    but I figured that I need to connect the function to go back to normal size to the signal from the esc-key.

    can somebody tell me how to implement that? do I have to create an event?

  • Moderators

    you probably want to look at "QKeyEvent":http://developer.qt.nokia.com/doc/qt-4.7/qkeyevent.html doc.
    Since this is UI, you can also take a look at "QWidget::keyPressedEvent":http://developer.qt.nokia.com/doc/qt-4.7/qwidget.html#id-e6f38482-7464-4202-b7a9-fcc07427fd75 virtual slot

  • Also if for some reason you don't want to reimplement QWidget::keyPressedEvent (which is, by the way, not a slot) you can create new QAction, assign a shortcut to it and invoke QWidget::addAction() for your second ui's widet.

  • p-himik,
    like this?
    @QAction* escape = new QAction(this);


    how can a function / slot be triggered by this key now?

  • this code isn't right... " no matching function for call to 'QAction::shortcut(Qt::Key)' "

  • Hi Anna,

    have a look at the "docs of QAction:":http://doc.qt.nokia.com/latest/qaction.html#shortcut-prop

    change shortcut(xxx) to setShortcut(xxx) and it should work.

    Additionally, have a look at the "shortcutContext property":http://doc.qt.nokia.com/latest/qaction.html#shortcutContext-prop

  • thank you, Gerolf!

    I still can't get it to work.

    that's what I 've implemented in the constructor of the main widget class:

    @Andon::Andon(QWidget *parent) :
    ui(new Ui::Andon)

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), ui->widget, SLOT(showTime()));
    QAction* escape = new QAction(this);
    connect(escape, SIGNAL(changed()), this, SLOT(exit()));


    and this is the exit slot:
    @void Andon::exit()

    what could be wrong?

  • Are you sure the input focus is on a child of the widget?

    why do you connect the c hanged signal? I typically use triggered(bool) and connect it to a slot like yours.

  • the input focus is the widget itself, I guess. (ui->widget)

    as described earlier, I show the widget fullscreen and I would like to show it normally with the held of the ecs key.

    which signal should I take: triggered() or toggled(bool)? (there is no triggered(bool))
    but so far, it doesn't work with neither of them

  • ups, I meant triggered() :-)

  • works now! thank you :)

Log in to reply