Qt Custom widget border problem
-
wrote on 20 Feb 2016, 11:39 last edited by
I'm creating Qt widget custom border.
I created widget and added QGridLayout on whole widget's area.Then I added four diagonal resize widgets for four corners, two horizontal resize widget bar and two vertical resize bar.
And then Title bar widget with (minimize, maximize and close buttons)This is picture
but after adding menu bar I'v got this. i.e Menu bar is not under title bar.
this is the code :
setWindowFlags(Qt::FramelessWindowHint); ui.lfGridLayout_->setHorizontalSpacing(0); ui.lfGridLayout_->setVerticalSpacing(0); // Top Side ui.lfGridLayout_->addWidget(&dgResizebars[0], 0, 0, Qt::AlignLeft|Qt::AlignTop); ui.lfGridLayout_->addWidget(&hResizeBars_[0], 0, 1, Qt::AlignTop); ui.lfGridLayout_->addWidget(&dgResizebars[1], 3, 2, Qt::AlignLeft|Qt::AlignBottom); // Left side ui.lfGridLayout_->addWidget(&vResizeBars_[0], 1, 0, Qt::AlignLeft); ui.lfGridLayout_->addWidget(&dgResizebars[2], 3, 0, Qt::AlignRight|Qt::AlignBottom); // Bottom side ui.lfGridLayout_->addWidget(&hResizeBars_[1], 3, 1, Qt::AlignBottom); ui.lfGridLayout_->addWidget(&dgResizebars[3], 0, 2, Qt::AlignRight|Qt::AlignTop); //Right Side ui.lfGridLayout_->addWidget(&vResizeBars_[1], 1, 2,Qt::AlignRight); ui.lfGridLayout_->addWidget(&windowTitleBar_, 1, 1, Qt::AlignTop); ui.lfGridLayout_->addWidget(&menuBar_, 2, 1, Qt::AlignTop);
how can I solve this?
-
Your numbering is confusing. You have a comment "Top Side" and you add something to row 3. You also add 3 things to the top and only 2 to the botton etc. Also you don't need the alignment flag. It is only needed when you have a fixed sized widget that is smaller than the grid cell it's gonna be in. In your case you want the widgets to fill entire cells, which is the default.
Anyway, should be something like this:
setWindowFlags(Qt::FramelessWindowHint); ui.lfGridLayout_->setContentsMargins(0, 0, 0, 0); ui.lfGridLayout_->setSpacing(0); //top (row 0) ui.lfGridLayout_->addWidget(&dgResizebars[0], 0, 0); ui.lfGridLayout_->addWidget(&hResizebars[0], 0, 1); ui.lfGridLayout_->addWidget(&dgResizebars[1], 0, 2); //bottom (row 4) ui.lfGridLayout_->addWidget(&dgResizebars[2], 4, 0); ui.lfGridLayout_->addWidget(&hResizebars[1], 4, 1); ui.lfGridLayout_->addWidget(&dgResizebars[3], 4, 2); //left side (rows 1-3) ui.lfGridLayout_->addWidget(&vResizebars[0], 1, 0, 3, 1); //spans 3 rows //right side (rows 1-3) ui.lfGridLayout_->addWidget(&vResizebars[1], 1, 2, 3, 1); //spans 3 rows //title bar (row 1) ui.lfGridLayout_->addWidget(&windowTitleBar_, 1, 1); //menu bar (row 2) ui.lfGridLayout_->addWidget(&menuBar_, 2, 1); //content (row 3) ui.lfGridLayout_->addWidget(&contentWidget, 3, 1);
-
wrote on 20 Feb 2016, 13:55 last edited by Alatriste
@Chris-Kawa said:
setContentsMargins
I have one question about this: 4 th column parameter.
ui.lfGridLayout_->addWidget(&vResizeBars_[0], 1, 0, 3, 1); //spans 3 rows
this means that vResizebar srarts from first column and will take width until second column right?
I replaced 4 th parameter from 1 to 0 like thatui.lfGridLayout_->addWidget(&vResizeBars_[0], 1, 0, 3, 0); //spans 3 rows
and I have same result..
-
this means that vResizebar srarts from first column and will take width until second column right?
No , that's not correct.
ui.lfGridLayout_->addWidget(&vResizeBars_[0], 1, 0, 3, 1);
Breaking down the params:
1 - widget is placed in row 1
0 - widget is placed in column 0
3 - widget occupies 3 rows
1 - widget occupies 1 column
Don't put 0 in any of the last two parameters.Here's a picture to make it more clear:
Edit: Ok, I think I know where the confusion came from. you probably meant "h" in "hResizebars" to mean "horizontally resizes window", while I meant "the bar itself is horizontal". If that's the case just mentally switch "h" and "v" in my picture and code ;)
-
wrote on 20 Feb 2016, 14:39 last edited by
"you probably meant "h" in "hResizebars" to mean "horizontally resizes window" - Right,
so generally it's works, thanks
1/5