初接触Qt,使用的教程是陆文周编写的《Qt5开发及实例》一书。

其中有关于QDockWidget、QStackedWidget这些类的介绍和使用实例。

要首先说明的是书上讲的非常的清楚,代码也附得非常明白,这本书还是非常值得看看的。

由于是初学,在新建工程的时候,我没有注意到基类的这个细节,没有按照教程上说的新建一个基于QDailog的类的项目,而是新建了一个基于QMainWindow的。

这就给我后面留下了一个问题,在使用布局的时候始终不起作用。

我先附上代码(Ps:代码没有问题,只是基类不是QDailog)Layout.cpp的构造函数中的代码

#include "layout.h"

Layout::Layout(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{ //ui.setupUi(this); /* ---- QDockWidget 停靠窗口类
setWindowTitle(tr("DockWin")); QDockWidget *dock = new QDockWidget(tr("DockWin-1"),this);//停靠窗口1,可移动
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); addDockWidget(Qt::RightDockWidgetArea,dock);
dock = new QDockWidget("DockWin-2",this);//停靠窗口2,可浮动,可关闭
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::RightDockWidgetArea,dock); dock = new QDockWidget("DockWin-3",this);//停靠窗口3,可浮动,可关闭
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
addDockWidget(Qt::RightDockWidgetArea,dock);
----- */
//setWindowTitle(tr("StackedWidget"));//QStackedWidget堆栈窗体类
setGeometry(,,,);
//堆栈窗口类
QListWidget *list;
QStackedWidget *stack; QLabel *label1;
QLabel *label2;
QLabel *label3; QWidget *widget1;
QWidget *widget2;
QWidget *widget3; //QWidget *newWidget = new QWidget(this);
//QDockWidget *Widget = new QDockWidget(this);
//QWidget *newWidget = new QWidget;
//Widget->setWidget(newWidget);
//Widget->setTitleBarWidget(newWidget);
//->setCentralWidget(newWidget);
list = new QListWidget(this);
//newWidget->setMinimumWidth(200);
//newWidget->setMinimumHeight(80);
//Widget->setMinimumWidth(200);
//Widget->setMinimumHeight(80);
list->insertItem(,tr("label-1"));
list->insertItem(,tr("label-2"));
list->insertItem(,tr("label-3")); label1 = new QLabel(tr("label - text - 1"));
label2 = new QLabel(tr("label - text - 2"));
label3 = new QLabel(tr("label - text - 3")); stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3); QHBoxLayout *mainlayout = new QHBoxLayout(this);
mainlayout->setMargin();
mainlayout->setSpacing();
mainlayout->addWidget(list);
mainlayout->addWidget(stack,,Qt::AlignHCenter);
mainlayout->setStretchFactor(list,);
mainlayout->setStretchFactor(stack,);
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
this->setLayout(mainlayout); } Layout::~Layout()
{ }

运行效果是这样的:

可以很明显的看出来,布局是没有效果的。QLabel全都堆在了一起。

首先,已经说过了,只要新建项目的时候基于QDailog便不会有这个问题了

其次,由于我使用的是VS2008+Qt addin所以编译的时候并没有报错,如果使用的Qt Creater其实编译会提示一个这样的错误的:

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout

这句话的意思是说,你已经给MainWindow设置过一个布局了,再设置一个就会出错。

或者你就是想要建基于QMainWindow的项目,那么解决方法是什么呢?

可以借助一个QWidget来解决这个问题,请看修改(1),(2)代码后的运行效果:

可以看到布局已经生效了,但是由于尺寸问题,newWidget并没有充满整个窗口。此时我们只需要加入代码(3)即可:

 #include "layout.h"

 Layout::Layout(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
//ui.setupUi(this);
/* ---- QDockWidget 停靠窗口类
setWindowTitle(tr("DockWin"));
QDockWidget *dock = new QDockWidget(tr("DockWin-1"),this);//停靠窗口1,可移动
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); addDockWidget(Qt::RightDockWidgetArea,dock);
dock = new QDockWidget("DockWin-2",this);//停靠窗口2,可浮动,可关闭
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::RightDockWidgetArea,dock); dock = new QDockWidget("DockWin-3",this);//停靠窗口3,可浮动,可关闭
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
addDockWidget(Qt::RightDockWidgetArea,dock);
----- */
//setWindowTitle(tr("StackedWidget"));//QStackedWidget堆栈窗体类
setGeometry(,,,);
//堆栈窗口类
QListWidget *list;
QStackedWidget *stack;
QLabel *label1;
QLabel *label2;
QLabel *label3;
QWidget *widget1;
QWidget *widget2;
QWidget *widget3;
//QWidget *newWidget = new QWidget(this);
//QDockWidget *Widget = new QDockWidget(this);
QWidget *newWidget = new QWidget(this);//!!!!!添加代码(1)
setCentralWidget(newWidget);//!!!!添加代码(3)
//Widget->setWidget(newWidget);
//Widget->setTitleBarWidget(newWidget);
//->setCentralWidget(newWidget);
list = new QListWidget(this);
//newWidget->setMinimumWidth(200);
//newWidget->setMinimumHeight(80);
//Widget->setMinimumWidth(200);
//Widget->setMinimumHeight(80);
list->insertItem(,tr("label-1"));
list->insertItem(,tr("label-2"));
list->insertItem(,tr("label-3")); label1 = new QLabel(tr("label - text - 1"));
label2 = new QLabel(tr("label - text - 2"));
label3 = new QLabel(tr("label - text - 3")); stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3); QHBoxLayout *mainlayout = new QHBoxLayout(this);
mainlayout->setMargin();
mainlayout->setSpacing();
mainlayout->addWidget(list);
mainlayout->addWidget(stack,,Qt::AlignHCenter);
mainlayout->setStretchFactor(list,);
mainlayout->setStretchFactor(stack,);
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
newWidget->setLayout(mainlayout);//this->setLayout(mainlayout);!!!!修改代码(2)
}
Layout::~Layout(){
}

运行效果:

那么在QDockWidget中出现这个问题应该如何处理呢?我们知道QDockWidget中并没有

 setCentralWidget()这个方法。答案是SetWidget()
请看代码:
 #include "layout.h"

 Layout::Layout(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
//ui.setupUi(this);
/* ---- QDockWidget 停靠窗口类
setWindowTitle(tr("DockWin"));
QDockWidget *dock = new QDockWidget(tr("DockWin-1"),this);//停靠窗口1,可移动
dock->setFeatures(QDockWidget::DockWidgetMovable);
dock->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); addDockWidget(Qt::RightDockWidgetArea,dock);
dock = new QDockWidget("DockWin-2",this);//停靠窗口2,可浮动,可关闭
dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);
addDockWidget(Qt::RightDockWidgetArea,dock); dock = new QDockWidget("DockWin-3",this);//停靠窗口3,可浮动,可关闭
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
addDockWidget(Qt::RightDockWidgetArea,dock);
----- */
//setWindowTitle(tr("StackedWidget"));//QStackedWidget堆栈窗体类
setGeometry(,,,);
//堆栈窗口类
QListWidget *list;
QStackedWidget *stack;
QLabel *label1;
QLabel *label2;
QLabel *label3;
QWidget *widget1;
QWidget *widget2;
QWidget *widget3;
//QWidget *newWidget = new QWidget(this);
QDockWidget *Widget = new QDockWidget(this);//!!添加代码(4)
QWidget *newWidget = new QWidget(this);//!!!!!添加代码(1)
//setCentralWidget(newWidget);//!!!!添加代码(3)
Widget->setWidget(newWidget);//添加代码(5)
//Widget->setTitleBarWidget(newWidget);
//->setCentralWidget(newWidget);
list = new QListWidget(this);
//newWidget->setMinimumWidth(200);
//newWidget->setMinimumHeight(80);
//Widget->setMinimumWidth(200);
//Widget->setMinimumHeight(80);
list->insertItem(,tr("label-1"));
list->insertItem(,tr("label-2"));
list->insertItem(,tr("label-3")); label1 = new QLabel(tr("label - text - 1"));
label2 = new QLabel(tr("label - text - 2"));
label3 = new QLabel(tr("label - text - 3")); stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3); QHBoxLayout *mainlayout = new QHBoxLayout(this);
mainlayout->setMargin();
mainlayout->setSpacing();
mainlayout->addWidget(list);
mainlayout->addWidget(stack,,Qt::AlignHCenter);
mainlayout->setStretchFactor(list,);
mainlayout->setStretchFactor(stack,);
connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
newWidget->setLayout(mainlayout);//this->setLayout(mainlayout);!!!!修改代码(2)
}
Layout::~Layout(){
}

运行效果:

PS:

  其实QMainWindow和QDailog的基类都是QWidget,真的搞不懂为何在QDailog派生的类中可以直接使用布局类,而在QMainWindow的派生类中却不可以。

  知其然而不知其所以然的感受不太好,望知道的大神解疑。

												

[Qt初级] 解决 中QMainWindow和QDockWidget添加布局失败问题的更多相关文章

  1. QT中QMainWindow、QWidget、QDialog

    QT中QMainWindow.QWidget.QDialog 简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应 ...

  2. 【Qt开发】QScrollArea添加布局后没有出现滚动条的解决方法

    [Qt开发]QScrollArea添加布局后没有出现滚动条的解决方法 标签:[Qt开发] 说明:尝试利用滚动区域显示多张图片,为了能够动态地往滚动区域贴图,为滚动区域设置了布局,然后通过布局来添加wi ...

  3. Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法

    之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果. 1.弹出 ...

  4. 关于QT建立项目中遇到的相关问题的处理办法

    关于QT建立项目中遇到的相关问题的处理办法 1.在QTCreater中新建一个空的工程时,第一次运行会抱一个错误,如下: -1: error: LNK1123: 转换到 COFF 期间失败: 文件无效 ...

  5. 如何在Qt资源文件中包含和释放exe等各种类型文件?

    操作系统:Windows 10 X64 企业版 Qt: 5.8.0 QtCreater: 4.2.1 刚刚开始学习Qt,不断遇到困难和挑战,前几天在各个QQ群里询问如何在Qt的资源文件中包含和释放ex ...

  6. cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题

    最近在解决XSS注入的问题,由于使用的servlet版本是2.5,不支持httpOnly的属性,故做了个工具类来实现cookie的httpOnly的功能.全类如下: /** * cookie工具类,解 ...

  7. 报表控件NCReport教程:集成NCReport到Qt应用程序中

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...

  8. Qt开发环境中使用报表控件FastReport遇到的一些问题(一)

    FastReport是一款优秀的报表控件,由俄罗斯开发,国内有代理商.Qt环境下可实现报表功能的还有一款叫NCReport,也是收费控件,比较来比较去还是觉得前者功能强点.网上讲解此控件在Qt中使用的 ...

  9. Qt应用程序中设置字体

    Qt应用程序中设置字体 应用程序中经常需要设置字体,例如office软件或者是其他的编辑器软件等等.这里主要涉及到如下几个概念:字体,字号以及风格(例如:粗体,斜体,下划线等等).Qt里面也有对应的类 ...

随机推荐

  1. gridview属性

    1.列头充满:AutoSizeColumnsMode, Fill. 2.列内容居中:ColumnHeadersDefaultCellStyle, MiddleCenter. 3.行内容居中:RowsD ...

  2. 6.UDP协议

    1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. UDP数据报结构: UDP首部格式: ...

  3. Pearson相关系数

    理解皮尔逊相关的两个角度 其一, 按照高中数学水平来理解, 皮尔逊相关(Pearson Correlation Coefficient)很简单, 可以看做将两组数据首先做Z分数处理之后, 然后两组数据 ...

  4. 对js原型对象的拓展和原型对象的重指向的区别的研究

    我写了如下两段代码: function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name ...

  5. swift 导航的使用

    导航还是有必要来搞一下的!!!!! 这只是一些基本的导航的使用.....感兴趣的猿可以自己去 废话不多   源码奉上   ⬇️ 首先  delegate里面 在 func application(ap ...

  6. HTML 颜色名

    目前所有浏览器都支持以下颜色名. 141个颜色名称是在HTML和CSS颜色规范定义的(17标准颜色,再加124).下表列出了所有颜色的值,包括十六进制值.  提示: 17标准颜色:黑色,蓝色,水,紫红 ...

  7. 最近总当机,IT帮网站用了1天时间成功搬家

    Posted on 2017年1月22日 最近一两周,IT帮的会员.BA学员和AM学员时不时反馈网站打不开.敏捷个人APP登录不了,有时候又可以但是很慢,还有的时候电信能访问而联通网络访问不了. 这个 ...

  8. 源码(03) -- java.util.Collection<E>

     java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...

  9. C++编程练习(12)----“有向图的拓扑排序“

    设G={V,E}是一个具有 n 个顶点的有向图,V中的顶点序列 v1,v2,......,vn,满足若从顶点 vi 到 vj 有一条路径,则在顶点序列中顶点 vi 必在顶点 vj 之前.则称这样的顶点 ...

  10. GIS制图课程前言

    一直以来都想写一本关于电子地图制图的工具书,把过去所遇到的关于电子地图制图的种种方法.技巧和问题进行总结和归纳,传播电子地图制图的思路和心得. 从2010年开始,陆陆续续在华南地区开展了多场的电子地图 ...