I am new QT and trying to develop the desktop application.
Currently I am facing a issue of alignment. I am using QTCreator 3.1.2 based on qt 5.3.1
I have 3 buttons placed in the windows as
After running application, If I resize the windows then buttons didn't stay in the center. like image 1 and if size is less then it is like image 2
I have tried using the hbox, but it didn't solve the problem and also scroll bar is also not visible in the window.
Would you please tell me how can I make these buttons to stay in the center only?
Thanks a lot
You can create QHBoxLayout passing this as its parent, which will set that layout as the layout of that widget, then add QPushButtons to that layout:
Widget::Widget(QWidget *parent) : QWidget(parent) {
// Prepare the horizonal layout, adding buttons
horizontalLayout = new QHBoxLayout(this);
pushButton = new QPushButton(this);
horizontalLayout->addWidget(pushButton);
pushButton_2 = new QPushButton(this);
horizontalLayout->addWidget(pushButton_2);
pushButton_3 = new QPushButton(this);
horizontalLayout->addWidget(pushButton_3);
// Set the layout of the central widget
setLayout(horizontalLayout);
}
Related
I am using Creator to build main MainWindow and I populate it with all my widgets.
I do not set any MainWindow lay out in this stage (like "Lay out in a Grid" or "Lay out Horizontally".
When I launch the Application I want to dynamically change the MainWindow layout of widgets in it to "Lay out in a Grid" like in Creator mode by pressing the left button.
I’ve tried hard all possible combinations reading many posts around.
this solution:
Qt: Can't set layout in QMainWindow
doesn't work and it does not make much sense to me.
I've tried:
QGridLayout * MainWindowLayout = new QGridLayout;
ui->setupUi(this);
centralWidget()->setLayout(MainWindowLayout);
NO LUCK
I've tried to put all my widgets inside a big widget at desegn time named MainWindowWidget and then setting it as a centralWidget
QGridLayout * MainWindowLayout = new QGridLayout;
ui->setupUi(this);
setCentralWidget(ui->MainWindowWidget);
centralWidget()->setLayout(MainWindowLayout);
NO LUCK
Ain't there any way to change the MainWindow widget's layout like "Lay ouy in a Grid" at design time when using the Creator??
EDIT:
To be more specific with NO LUCK I mean that the widgets are not placed as in a grid as expected.
Here is a code snipped that you can try on an empty application
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
/*
Place some widgets at design time with Creator (at least 2) in the MainWindow form
in a misplaced order and do not apply any "Lay out xxx" right button on QT Creator
*/
ui->setupUi(this);
/* HERE I WANT THE MainWindow or either an Object to take a specific Layout */
QGridLayout * MainWindowLayout = new QGridLayout;
ui->setupUi(this);
centralWidget()->setLayout(MainWindowLayout);
}
It is almost 2 days that I am googling and I can't find any way out
Thank you all for your help...
You are creating the layout But you are not adding widgets to it. This should fix your issue:
ui->setupUi(this);
QGridLayout *MainWindowLayout = new QGridLayout();
MainWindowLayout->addWidget(ui->label, 0, 0);
MainWindowLayout->addWidget(ui->label_2, 0, 1);
// Add all other widgets to your layout...
centralWidget()->setLayout(MainWindowLayout);
#C137
Finally I got it working doing the following:
I places all my form widgets into 3 different widgets (containers QFrame in my case).
Then I placed them into the Layout as suggested and it worked.
This solution is a bit tricky
QGridLayout *MainWindowLayout = new QGridLayout();
MainWindowLayout->addWidget(ui->MainFrame, 0, 0); // MainFrame --> My new object containing other widgets
MainWindowLayout->addWidget(ui->DebugButtonsFrame, 0, 1); // DebugButtonsFrame as above
MainWindowLayout->addWidget(ui->DebugMemoFrame, 1, 0); // DebugMemoFrame as above
// Add all other widgets to your layout...
centralWidget()->setLayout(MainWindowLayout);
QT is handling this task in its own way a bit confusing from my point of view. While I was using Embarcadero the Layout were much much easier to manage.
I thought there could me a method to easily set the MainWindow Layout as in Creator mode which was much much easier and faster to handle.
So far it worked as expected but still confusing.
Thank you all for the support.
I designed a QMainWindow with QtCreator's designer. It consists of the default central widget (a QWidget) which contains a QVBoxLayout with all the other widgets in it. Now everything I want, is that the QVBoxLayout automatically occupies the whole central widgets rectangle space.
How can I do this? I didn't find any usable property neither in the central widgets properties nor the QVBoxLayout's ones.
If you want to do it with code instead of using QtCreator, you could set the layout in a QWidget and then set the QWidget as the central widget of the main window like this:
#include <QtGui>
#include <QWidget>
#include <QHBoxLayout>
#include "mainwindow.h"
MainWindow::MainWindow() {
// Set layout
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(myWidget1);
layout->addWidget(myWidget2);
// Set layout in QWidget
QWidget *window = new QWidget();
window->setLayout(layout);
// Set QWidget as the central layout of the main window
setCentralWidget(window);
}
You don't have to create a QVBoxLayout manually. Just select your central QWidget and press a make-layout button.
Add at least one widget on your MainWindow. Then select your window by clicking on it and click on the VerticalLayout Button at the top of QTCreator. You Vertical Layout is automatically added to the central widget and fills all the surface.
This is already answered, but I personally prefer to keep all control elements and layouts added manually to the form. I do not add controls in the class files, I merely hook up the signals/slots to hide/show widgets relevant to the logic in the class, within the class.
To manually add a layout to any widget you must first add at least one child widget/control. That wasn't totally clear to me and I was trying to add the layout first.
I have a QtChart in a QDialog and I use a simple QWidget to show it on the screen. I need to resize this hart whenever the dialog window is resized by user.
This is how I add the chart to the dialog (in constructor):
// Setup chart view to show the chart
mChartView = new QChartView(mChart, ui->widget);
mChartView->setParent(this);
mChartView->resize(ui->widget->size());
mChartView->setRenderHint(QPainter::Antialiasing);
I have overrided the resizeEvent of the QDialog in my own dialog:
void CurveDialog::resizeEvent(QResizeEvent *event)
{
mChartView->resize(ui->widget->size());
}
This works, and the chart gets resized...but the problem is it is terribly slow! because it will resize for all the steps that user drags the window corner to resize it!
How can I do the resize only when there resize is done? I wanted to use a timer but this looks like a dirty hack! any better ideas?
Qt provides a layout system to manage the geometries of child widgets within a widget. A layout will arrange the size and the position of each child to ensure that it will take all the available space.
The layout will automatically resize the child widgets when the parent is resized:
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
QDialog* dialog = new QDialog();
QVBoxLayout* layoutDialog = new QVBoxLayout(dialog);
QWidget* widget = new QWidget();
QVBoxLayout* layoutWidget = new QVBoxLayout(widget);
layoutDialog->addWidget(widget);
layoutWidget->addWidget(chartView);
dialog->exec();
Since QVBoxLayout has no a setStylesheet method, I thought this would made the trick:
QWidget *window = new QWidget(this);
window->setStyleSheet("background-image:url(:/images/sky.jpg);font-size:18px;");
QVBoxLayout * layout = new QVBoxLayout(window);
layout->addWidget(widg1);
layout->addWidget(widg2);
setLayout(layout);
Sadly, only a small rectangle of background image appears, not covering entire window. How could I do it?
You can set stylesheet to the central widget of your main window. In the example you can put window into some other layout.
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
textEdit1 = new QTextEdit();
textEdit1->setWindowTitle("First Notepad");
textEdit2 = new QTextEdit();
textEdit2->setWindowTitle("First Notepad");
layout = new QVBoxLayout();
layout->addWidget(textEdit1);
layout->addWidget(textEdit2);
newTab = new QWidget();
newTab->setLayout(layout);
ui->setupUi(this);
setCentralWidget(newTab);
}
The above is my code sample of the MainWindow constructor. Ot has two qTextEdits which are in a VerticalBox layout. I want both the textEdits to have a title bar and minimize and maximize button so that at a time I can use one of them or both of them. But as you can see the output the Window Title bars are not there.
How can I make the Title bar appear? Why is it that setWindowTitle("First Notepad") do not display the Title?
If I am doing it wrong please suggest as what other way I can proceed. Any suggestion is welcome.
What I am trying is like one MainWindow having multiple sub-windows with fixed positions.
What I am trying is like one MainWindow having multiple sub-windows with fixed positions.
What you are looking for is probably a QMdiArea along with multiple QMdiSubWindow.
As mentioned in the documentation of `QMdiArea:
The QMdiArea widget provides an area in which MDI windows are displayed
Moreover:
QMdiArea is commonly used as the center widget in a QMainWindow to create MDI applications, but can also be placed in any layout.
I've used it, but I've never tried to give fixed positions to the subwindows. Anyway it's apparently possible. Probably QMdiArea::tileSubWindows is already enough for your requirements.
Set custom titles and bars to the windows is given for free instead:
QMdiSubWindow represents a top-level window in a QMdiArea, and consists of a title bar with window decorations, an internal widget, and (depending on the current style) a window frame and a size grip. QMdiSubWindow has its own layout, which consists of the title bar and a center area for the internal widget
See the official documentation for further details.