how to setAlignment of QGroupBox



  • want to set the alignment of a QGroupBox title to the left but it stays centered. What I've tried is:

    QGroupBox *groupBox = new QGroupBox(tr("Test"), parent);
    groupBox->setAlignment(Qt::AlignLeft);
    

    any idea how I can get this aligned accordingly? I do not set any particular styles!



  • @cerr
    can you show me what u get using image ?


  • Moderators

    @cerr The default alignment is already Qt::AlignLeft.
    http://doc.qt.io/qt-5/qgroupbox.html#alignment-prop



  • @Ratzz said in how to setAlignment of QGroupBox:

    @cerr
    can you show me what u get using image ?

    https://postimg.org/image/dc7rd4ub9/


  • Moderators

    @cerr Looks like you have added the groupbox in a layout?
    Can you post the relevant code ?



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr Looks like you have added the groupbox in a layout?
    Can you post the relevant code ?

    Correct,

    Okay, so let's see:
    My groupBox is here, in addTerminal() which gets called with a QSplitter as parent... - not sure if that's enough...

    
    Terminal* Session::addTerminal(QWidget* parent)
    {
        Terminal* terminal = new Terminal(parent);
        connect(terminal, SIGNAL(activated(int)), this, SLOT(setActiveTerminal(int)));
        connect(terminal, SIGNAL(manuallyActivated(Terminal*)), this, SIGNAL(terminalManuallyActivated(Terminal*)));
        connect(terminal, SIGNAL(titleChanged(int,QString)), this, SLOT(setTitle(int,QString)));
        connect(terminal, SIGNAL(keyboardInputBlocked(Terminal*)), this, SIGNAL(keyboardInputBlocked(Terminal*)));
        connect(terminal, SIGNAL(silenceDetected(Terminal*)), this, SIGNAL(silenceDetected(Terminal*)));
        connect(terminal, SIGNAL(destroyed(int)), this, SLOT(cleanup(int)));
    
        m_terminals.insert(terminal->id(), terminal);    
        
        QGroupBox *groupBox = new QGroupBox(tr("Test"), parent);
        groupBox->setAlignment(Qt::AlignLeft);
        QWidget* terminalWidget = terminal->terminalWidget();
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(terminalWidget);
        groupBox->setLayout(vbox);
        terminalWidget ->show();
        if (/*terminalWidget*/groupBox) /*terminalWidget*/groupBox->setFocus();
        groupBox->show();
    
        return terminal;
    }
    

    and then, the constructor for Terminal() looks like this:

    Terminal::Terminal(QWidget* parent) : QObject(parent)
    {
        m_terminalId = m_availableTerminalId;
        m_availableTerminalId++;
    
        m_keyboardInputEnabled = true;
    
        m_monitorActivityEnabled = false;
        m_monitorSilenceEnabled = false;
    
        m_part = NULL;
        m_terminalInterface = NULL;
        m_partWidget = NULL;
        m_terminalWidget = NULL;
        m_parentSplitter = parent;
    
        KPluginFactory* factory = 0;
        KService::Ptr service = KService::serviceByDesktopName("konsolepart");
        if( service )
        {
            factory = KPluginLoader(service->library()).factory();
    
        m_part = factory ? (factory->create<KParts::Part>(parent)) : 0;
    
        if (m_part)
        {
            connect(m_part, SIGNAL(setWindowCaption(QString)), this, SLOT(setTitle(QString)));
            connect(m_part, SIGNAL(overrideShortcut(QKeyEvent*,bool&)), this, SLOT(overrideShortcut(QKeyEvent*,bool&)));
            connect(m_part, SIGNAL(destroyed()), this, SLOT(deleteLater()));
    
            m_partWidget = m_part->widget();
    
            m_terminalWidget = m_part->widget()->focusWidget();
    
            if (m_terminalWidget)
            {
                m_terminalWidget->setFocusPolicy(Qt::WheelFocus);
                m_terminalWidget->installEventFilter(this);
            }
    
            disableOffendingPartActions();
    
            m_terminalInterface = qobject_cast<TerminalInterface*>(m_part);
            if (m_terminalInterface) m_terminalInterface->showShellInDir(QDir::homePath());
        }
        else
            displayKPartLoadError();
        }
    }
    

  • Moderators

    @cerr This part looks odd:

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(terminalWidget);
    groupBox->setLayout(vbox);
    

    You should set layout (vbox) to your main widget and in this layout add widgets groupBox and terminalWidget.



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr This part looks odd:

    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(terminalWidget);
    groupBox->setLayout(vbox);
    

    You should set layout (vbox) to your main widget and in this layout add widgets groupBox and terminalWidget.

    Hmm, I don't get this, so are you saying this should look something like:

        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(terminalWidget);
        vbox->addWidget(groupBox);
        parent->setTerminalLayout(vbox); // vbox->setLayout() would be called within this method
        terminalWidget ->show();
        if (groupBox) groupBox->setFocus();
    

    but I don't see what a differnce it'll make to call setLayout from within another wrapper , I must not understand you properly - can you clarify, please?

    Thanks!


  • Moderators

    @cerr What I imagined was that you are trying to create a main widget and in that you want to add a groupbox and terminalwidget so I suggested to add this layout(vbox) to the main widget and in that you add these 2 widgets so that they are arranged vertically. Is this the requirement ?



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr What I imagined was that you are trying to create a main widget and in that you want to add a groupbox and terminalwidget so I suggested to add this layout(vbox) to the main widget and in that you add these 2 widgets so that they are arranged vertically. Is this the requirement ?

    By main widget you understand a "mother widget" that would contain the groupbox & the terminal widget, right? What I want to do is, to nest the terminalwidget within a groupbox so that there is an ability to assign the terminalwidget some kind of membership (that makes visually sense, too). If you have a better idea on how to solve this, please don't be shy to let me know! Thanks!


  • Moderators

    @cerr

    By main widget you understand a "mother widget" that would contain the groupbox & the terminal widget, right?

    Yes.

    So now where do you add this groupbox ? You should add this groupbox inside another layout so that it is laid properly.



  • @p3c0 said in how to setAlignment of QGroupBox:

    Yes.

    So now where do you add this groupbox ? You should add this groupbox inside another layout so that it is laid properly.

    So I currently have something lke groupBox(vbox(terminalWidget())) and I think from what you're saying, I should have something like ContainerWidget(vbox(groupBox(terminalWidget))), is that correct? Any idea what kind of container widget I can use for this? Or better, vbox(groupBox(terminalWidget)) should do as well, shouldn't it?


  • Moderators

    @cerr

    ContainerWidget(vbox(groupBox(terminalWidget))), is that correct?

    Yes. You can use QDialog as the container widget.



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr

    ContainerWidget(vbox(groupBox(terminalWidget))), is that correct?

    Yes. You can use QDialog as the container widget.

    But I don't want it to be in abother dialog and it already is in a QTabWidget....I should use that as the outer most layer probably...


  • Moderators

    @cerr Ok. But remember to add that groupbox inside a layout.



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr Ok. But remember to add that groupbox inside a layout.

    So what actually happens in my application is:
    MainWindow->QTabWidget->session->setupSession->addTerminal->QVBoxWidget(QGroupBox->terminalWidget) and you suggest i'd better be like mainwindow->QVBoxWidget(QTabWidget->session->setupSession->addTerminal->QGroupBox->terminalWidget) ?
    Will that change things?


  • Moderators

    @cerr No. The earlier one.
    MainWindow->QTabWidget->session->setupSession->addTerminal->QVBoxWidget(QGroupBox->terminalWidget)

    But I dont see that happening in your original code.

    QGroupBox *groupBox = new QGroupBox(tr("Test"), parent); //<--- This should be added in a layout too.
    groupBox->setAlignment(Qt::AlignLeft);
    
    QWidget* terminalWidget = terminal->terminalWidget();
    
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(terminalWidget);
    groupBox->setLayout(vbox); // <--- This sets layout inside it
    
    terminalWidget ->show();
    if (/*terminalWidget*/groupBox) /*terminalWidget*/groupBox->setFocus();
       groupBox->show();
    


  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr No. The earlier one.
    MainWindow->QTabWidget->session->setupSession->addTerminal->QVBoxWidget(QGroupBox->terminalWidget)

    But I dont see that happening in your original code.

    QGroupBox *groupBox = new QGroupBox(tr("Test"), parent); //<--- This should be added in a layout too.
    groupBox->setAlignment(Qt::AlignLeft);
    
    QWidget* terminalWidget = terminal->terminalWidget();
    
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(terminalWidget);
    groupBox->setLayout(vbox); // <--- This sets layout inside it
    
    terminalWidget ->show();
    if (/*terminalWidget*/groupBox) /*terminalWidget*/groupBox->setFocus();
       groupBox->show();
    

    Sorry,

    Yeah, I had changed it in the meantime to:

        QGroupBox *groupBox = new QGroupBox(tr("Test"), parent);
        groupBox->setAlignment(Qt::AlignLeft);
        QWidget* terminalWidget = terminal->terminalWidget();
        QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(terminalWidget);
        vbox->addWidget(groupBox);
        //groupBox->setLayout(vbox);  <- if i remove the comment, it won't start my application at all...
        terminalWidget ->show();
        if (/*terminalWidget*/groupBox) /*terminalWidget*/groupBox->setFocus();
    

  • Moderators

    @cerr So now set vbox as a layout to its parent widget.



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr So now set vbox as a layout to its parent widget.

    Did you mean like?

    QVBoxLayout *vbox = new QVBoxLayout;
        vbox->addWidget(terminalWidget);
        vbox->addWidget(groupBox);
        vbox->addWidget(parent);
        groupBox->setLayout(vbox);
        terminalWidget ->show();
    ``` - that doesn't let me open my application...

  • Moderators

    @cerr Probably something like this. Assuming QDialog is my main widget which contains groupbox.

    QVBoxLayout *mainLayout = new QVBoxLayout;
    myDialog->setLayout(mainLayout);
    
    //Now add widgets into this layout
    
    mainLayout->addWidget(groupBox);// groupbox first
    mainLayout->addWidget(terminalWidget);
    

    Now in your case if you want to add terminalWidget inside a groupbox's layout you can create new one and add into it keeping mainLayout as it is.



  • @p3c0 said in how to setAlignment of QGroupBox:

    Thanks for pitching in, I guess this is what I was missing. I now have this (which I can work with going forward):

    Terminal* Session::addTerminal(QWidget* parent)
    {    
      
        QGroupBox *groupBox = new QGroupBox(tr("Test"), parent);    
        groupBox->setAlignment(Qt::AlignLeft);
        QVBoxLayout *vbox = new QVBoxLayout;    
        groupBox->setLayout(vbox);    
        vbox->addWidget(groupBox);
        
        Terminal* terminal = new Terminal(parent);
        connect(terminal, SIGNAL(activated(int)), this, SLOT(setActiveTerminal(int)));
        connect(terminal, SIGNAL(manuallyActivated(Terminal*)), this, SIGNAL(terminalManuallyActivated(Terminal*)));
        connect(terminal, SIGNAL(titleChanged(int,QString)), this, SLOT(setTitle(int,QString)));
        connect(terminal, SIGNAL(keyboardInputBlocked(Terminal*)), this, SIGNAL(keyboardInputBlocked(Terminal*)));
        connect(terminal, SIGNAL(silenceDetected(Terminal*)), this, SIGNAL(silenceDetected(Terminal*)));
        connect(terminal, SIGNAL(destroyed(int)), this, SLOT(cleanup(int)));
        m_terminals.insert(terminal->id(), terminal);    
        QWidget* terminalWidget = terminal->terminalWidget();
        
        vbox->addWidget(terminalWidget);
        
        terminalWidget->show();
        if (groupBox) groupBox->setFocus();
        return terminal;
    }
    

    But now back to the top, while it looks like this now: https://postimg.org/image/viahdjbwp/ how do I get the GroupBox label aligned to the left?


  • Moderators

    @cerr Here is a small example that demonstrates it:

    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QDialog d;
        d.resize(400, 400);
        d.show();
    
        QVBoxLayout mainLayout;
        d.setLayout(&mainLayout);
    
        QGroupBox box;
        box.setTitle("MyGroupBox");
        mainLayout.addWidget(&box);
    
        QLabel label("MyLabel");
        mainLayout.addWidget(&label);
      
        return app.exec();
    }
    

    You can see the QGroupBox properly aligned to the left. Here the Groupbox is added into the main widget's layout. Try to do in the similar way.



  • @p3c0 said in how to setAlignment of QGroupBox:

    Thanks but I want the
    box.setTitle("MyGroupBox"); title to be left aligned, so I altered your example code to:

        QGroupBox box;
        box.setTitle("MyGroupBox");
        box.setAlignment(Qt::AlignLeft);
        mainLayout.addWidget(&box);
    

    but like in my application above, the title stays centered, can it be left aligned at all?
    This is from http://doc.qt.io/qt-5/qgroupbox.html#alignment-prop:

    alignment : Qt::Alignment

    This property holds the alignment of the group box title.


  • Lifetime Qt Champion

    Hi,

    Which window manager are you using ?

    I just tested on macOS and the alignment is working properly (self built 5.7)



  • @SGaist said in how to setAlignment of QGroupBox:

    Hi,

    Which window manager are you using ?

    I just tested on macOS and the alignment is working properly (self built 5.7)

    KDE 5.5.5 with Qt 5.5.1 (Kubuntu 16.04)


  • Moderators

    @cerr What does QApplication::style() returns in your case ?



  • @p3c0 said in how to setAlignment of QGroupBox:

    @cerr What does QApplication::style() returns in your case ?

    ? std::cout << "style:" << QApplication::style() << std::endl; returns:style:0x12a4590 is this what you were looking for?


  • Moderators

    @cerr I was just trying to find out what style was you application using. I assumed you might use qDebug() which would have properly printed the object info. Anyway try this:

    QApplication::style()->objectName();
    

    If it prints "fusion" (atleast on my system it does, KDE too here) then the the problem might be related to this bug which says it was fixed in Qt 5.6.1. Can you try the newer version ?



  • @p3c0 said in how to setAlignment of QGroupBox:

    objectName();

    Alright yes, qDebug() << "style:" << QApplication::style()->objectName(); gives me style: "breeze"


  • Moderators

    @cerr I can only suggest you to try with latest Qt version to rule out the possibility of this bug.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.