关于Qt5的布局问题,感觉很诡异,实在没方向了,各位帮忙看看.

暴暴熊 2016-03-10 09:41:42
我想在一个继承自QMdiSubWindow的界面上实现一个垂直的布局,代码实现很简单,但实际运行结果却失败了。以下是测试代码。
ContentWindowCL::ContentWindowCL(QWidget *parent):
QMdiSubWindow(parent)
{
setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle("aaaaa");
setObjectName("content");
resize(200,300);

//第1种情况:这样创建的三个部件可以正常布局
// QWidget *titleBarM = new QWidget();
// titleBarM->setStyleSheet("background:green");
// QWidget *toolBarM = new QWidget();
// toolBarM->setStyleSheet("background:yellow");
// QWidget *toolBoxM = new QWidget();
// toolBoxM->setStyleSheet("background:red");

//第2种情况:直接继承自QWidget,带有UI文件,
// CrTitleBarCL *titleBarM = new CrTitleBarCL();
// titleBarM->setStyleSheet("background:green");
// CrToolBarCL *toolBarM = new CrToolBarCL();
// toolBarM->setStyleSheet("background:yellow");
// CrToolBoxCL *toolBoxM = new CrToolBoxCL();
// toolBoxM->setStyleSheet("background:red");

//第3种情况:直接继承QWidget ,没有UI文件
aaa *titleBarM = new aaa();
titleBarM->setStyleSheet("background:green");
bbb *toolBarM = new bbb();
toolBarM->setStyleSheet("background:yellow");
ccc *toolBoxM = new ccc();
toolBoxM->setStyleSheet("background:red");

QLayout *mainLayout = this->layout();
mainLayout->setMargin(2);
mainLayout->setSpacing(2);
mainLayout->addWidget(titleBarM);
mainLayout->addWidget(toolBarM);
mainLayout->addWidget(toolBoxM);
}

第一种情况运行结果


第2,3种的自定义类里我没有添加任何代码,运行的结果


为什么会有这种差别呢??
上层是这样处理的: mdiArea = new QMdiArea();
QMainWindow->setCentralWidget(mdiArea);

contentWindow = new ContentWindowCL();
mdiArea->addSubWindow(contentWindow);
我想自定义三个窗口,让他们在QMdiSubWindow中垂直显示。用了所有我能想到的办法,在尝试了所有我能想到的布局办法之后,信心满满 用了一个继承自QFrame的部件来当做QMdiArea的子窗口,但是仍然无法实现垂直布局。问题出在什么地方呢????
各位大哥帮忙分析一下,多谢多谢。




...全文
838 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhs1573 2019-12-31
  • 打赏
  • 举报
回复 1
QT+web做界面吧,QT原生的布局不想吐槽,没见过这么烂的设计 Android html IOS 都是比QT强,QT布局(垂直布局 水平布局...)不能设置背景,不知道哪个萨比想出来的,基础的布局连个设置背景的功能没设计 拿出来说有多牛鼻 有多牛鼻的,
「已注销」 2018-08-16
  • 打赏
  • 举报
回复
引用 14 楼 wn0112 的回复:
[quote=引用 13 楼 CLHJSWE 的回复:]
[quote=引用 11 楼 wn0112 的回复:]
[quote=引用 10 楼 CLHJSWE 的回复:]
[quote=引用 8 楼 wn0112 的回复:]
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试


这个意思是使用css布局吗?
我这样写了

PushButton->setAttribute(Qt::WA_StyledBackground,true);
PushButton->setStyleSheet("margin:0px auto;");

酱子好像没用
[/quote]
这个是回楼主的

你的那个图,
整体垂直布局,上面一个QWidget,底部是QGridLayout,分3个格。
第一格QLabel, 第二格按钮,第三格空白QLabel[/quote]

谢谢,这个我知道了。不过如果把左下角那个标签的sizePolicy设置成Fixed,好像按钮就会靠过来,此时按钮就不在中间了,如果用伸缩因子的话,那也需要自己调整宽度或写代码调吧,不过这样的话,感觉就不算是用Qt布局功能布局了,到头来,还要用手调[/quote]
为什么SizePolicy要设置Fixed呢? 如果一定要设的话也好解决。
第一格里面加一个水平布局, 水平布局里加两个QLabel, 第一个SizePolicy 为 Fixed, 第二个空白,充当 SpacerItem[/quote]

加个标签这方法我上次弄出来了,大佬都这样说,那QT应该也没解决方法了,就这样子吧。谢谢大佬了!
「已注销」 2018-08-15
  • 打赏
  • 举报
回复
引用 11 楼 wn0112 的回复:
[quote=引用 10 楼 CLHJSWE 的回复:]
[quote=引用 8 楼 wn0112 的回复:]
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试


这个意思是使用css布局吗?
我这样写了

PushButton->setAttribute(Qt::WA_StyledBackground,true);
PushButton->setStyleSheet("margin:0px auto;");

酱子好像没用
[/quote]
这个是回楼主的

你的那个图,
整体垂直布局,上面一个QWidget,底部是QGridLayout,分3个格。
第一格QLabel, 第二格按钮,第三格空白QLabel[/quote]

谢谢,这个我知道了。不过如果把左下角那个标签的sizePolicy设置成Fixed,好像按钮就会靠过来,此时按钮就不在中间了,如果用伸缩因子的话,那也需要自己调整宽度或写代码调吧,不过这样的话,感觉就不算是用Qt布局功能布局了,到头来,还要用手调
王桑的一天 2018-08-15
  • 打赏
  • 举报
回复
引用 13 楼 CLHJSWE 的回复:
[quote=引用 11 楼 wn0112 的回复:]
[quote=引用 10 楼 CLHJSWE 的回复:]
[quote=引用 8 楼 wn0112 的回复:]
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试


这个意思是使用css布局吗?
我这样写了

PushButton->setAttribute(Qt::WA_StyledBackground,true);
PushButton->setStyleSheet("margin:0px auto;");

酱子好像没用
[/quote]
这个是回楼主的

你的那个图,
整体垂直布局,上面一个QWidget,底部是QGridLayout,分3个格。
第一格QLabel, 第二格按钮,第三格空白QLabel[/quote]

谢谢,这个我知道了。不过如果把左下角那个标签的sizePolicy设置成Fixed,好像按钮就会靠过来,此时按钮就不在中间了,如果用伸缩因子的话,那也需要自己调整宽度或写代码调吧,不过这样的话,感觉就不算是用Qt布局功能布局了,到头来,还要用手调[/quote]
为什么SizePolicy要设置Fixed呢? 如果一定要设的话也好解决。
第一格里面加一个水平布局, 水平布局里加两个QLabel, 第一个SizePolicy 为 Fixed, 第二个空白,充当 SpacerItem
萧洛 2018-08-14
  • 打赏
  • 举报
回复
为要布局的窗口创建一个垂直布局QVBoxLayout,(水平布局为QHBoxLayout)。如:
QVBoxLayout *verticalLayout = new QVBoxLayout(this); //this为要布局的窗口
QWidget *widget1 = new QWidget(this);
QWidget *widget2 = new QWidget(this);
verticalLayout->addWidget(widget1 );
verticalLayout->addWidget(widget1 );

同时,如果需要可以调用QWidget的setMinimumSize、setMaximumSize方法设置窗口最小、最大尺寸,以及其它方法。
王桑的一天 2018-08-14
  • 打赏
  • 举报
回复
引用 10 楼 CLHJSWE 的回复:
[quote=引用 8 楼 wn0112 的回复:]
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试


这个意思是使用css布局吗?
我这样写了

PushButton->setAttribute(Qt::WA_StyledBackground,true);
PushButton->setStyleSheet("margin:0px auto;");

酱子好像没用
[/quote]
这个是回楼主的

你的那个图,
整体垂直布局,上面一个QWidget,底部是QGridLayout,分3个格。
第一格QLabel, 第二格按钮,第三格空白QLabel
「已注销」 2018-08-13
  • 打赏
  • 举报
回复
引用 5 楼 wn0112 的回复:
[quote=引用 4 楼 CLHJSWE 的回复:]
我个人就觉得QT布局是垃圾,还不如自己写事件改位置

布局很好用啊,何出此言呢?[/quote]

可能我新手吧,大神,请问这种布局咋整
「已注销」 2018-08-13
  • 打赏
  • 举报
回复
引用 8 楼 wn0112 的回复:
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试


这个意思是使用css布局吗?
我这样写了

PushButton->setAttribute(Qt::WA_StyledBackground,true);
PushButton->setStyleSheet("margin:0px auto;");

酱子好像没用
王桑的一天 2018-08-13
  • 打赏
  • 举报
回复
引用 4 楼 CLHJSWE 的回复:
我个人就觉得QT布局是垃圾,还不如自己写事件改位置

布局很好用啊,何出此言呢?
王桑的一天 2018-08-13
  • 打赏
  • 举报
回复
继承自 QWidget 的子类加一句

this->setAttribute(Qt::WA_StyledBackground,true);

试试
王桑的一天 2018-08-13
  • 打赏
  • 举报
回复
引用 6 楼 CLHJSWE 的回复:
[quote=引用 5 楼 wn0112 的回复:]
[quote=引用 4 楼 CLHJSWE 的回复:]
我个人就觉得QT布局是垃圾,还不如自己写事件改位置

布局很好用啊,何出此言呢?[/quote]

可能我新手吧,大神,请问这种布局咋整
[/quote]

「已注销」 2018-08-12
  • 打赏
  • 举报
回复
我个人就觉得QT布局是垃圾,还不如自己写事件改位置
caiwei_cs 2016-03-22
  • 打赏
  • 举报
回复
引用 2 楼 u014724231 的回复:
[quote=引用 1 楼 caiwei_cs 的回复:] 布局和样式表没什么相互影响吧。 你把样式表放到自定义类里面试试。
不行 感觉三个QWidget的派生类似乎没有显示出来, 如果我在派生类的UI里加些button控件,到是能显示出来,可是却没有布局的效果, 似乎在QT4里样式表要作用于QWidget的派生类时,需要重写paintEvent函数。 那么对于布局是不是也有类似的处理呢??不知道是否需要重载QWidget的函数,诸如sizeHint()之类的。[/quote] 布局和派生没关系。你打印一下,看看控件的位置到底在哪里。
暴暴熊 2016-03-11
  • 打赏
  • 举报
回复
引用 1 楼 caiwei_cs 的回复:
布局和样式表没什么相互影响吧。 你把样式表放到自定义类里面试试。
不行 感觉三个QWidget的派生类似乎没有显示出来, 如果我在派生类的UI里加些button控件,到是能显示出来,可是却没有布局的效果, 似乎在QT4里样式表要作用于QWidget的派生类时,需要重写paintEvent函数。 那么对于布局是不是也有类似的处理呢??不知道是否需要重载QWidget的函数,诸如sizeHint()之类的。
caiwei_cs 2016-03-11
  • 打赏
  • 举报
回复
布局和样式表没什么相互影响吧。 你把样式表放到自定义类里面试试。

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧