提出问题:

  1. mainWin.h
#ifndef MAINWIN_H
#define MAINWIN_H
#include <QMainWindow>
class QSignalMapper;
class MainWin : public QMainWindow
{Q_OBJECTpublic:MainWin(QWidget *parent = 0);~MainWin();
private slots:void doClicked(const QString & btnname);
private:QSignalMapper *signalMapper;
private:
};#endif // MAINWIN_H
  1. mainWin.cpp
#include "mainwin.h"
#include <QSignalMapper>
#include <QMessageBox>
#include <QGridLayout>
#include <QPushButton>
#include <QWidget>MainWin::MainWin(QWidget *parent): QMainWindow(parent)
{signalMapper = new QSignalMapper(this);QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";//10个buttonQStringList texts = buttontext.split(",");QGridLayout *gridLayout = new QGridLayout();for (int i = 0; i < texts.size(); ++i){QPushButton *button = new QPushButton(texts[i]);connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));signalMapper->setMapping (button, texts[i]);gridLayout->addWidget(button, i / 3, i % 3);}connect(signalMapper, SIGNAL(mapped (const QString &)), this, SLOT(doClicked(const QString &)));setLayout(gridLayout);
}MainWin::~MainWin()
{}void MainWin::doClicked(const QString &btnname)
{QMessageBox::information(this, "Clicked", btnname + " is clicked!");//显示被按下的btn名称。
}

运行效果如图(我的按钮呢?):

难道是按钮没有设置父窗口?于是我做了如下修改:

QPushButton *button = new QPushButton(texts[i]);

改成:

QPushButton *button = new QPushButton(texts[i],this);

重新编译运行如图(所有按钮都重叠了)

分析问题

MainWindow中使用setLayout方法的时候却不管用,因QMainWindow是默认有layout的,所以再次设置layout会失效。

会出现这种提示:
QWidget::setLayout: Attempting to set QLayout “” on MainWindow “”, which already has a layout这句话的意思是说,你已经给MainWindow设置过一个布局了,再设置一个会出错。

该如何给QMainWindow正确地设置布局呢,要想QMainWidget创建布局,合理的步骤应该是这样的:

第一步创建一个QWidget实例,并将这个实例设置为centralWidget:

然后创建一个布局gridLayout,并把所需要的所有控件都往里面放:

解决问题:

mainWin.cpp修改后:

#include "mainwin.h"
#include <QSignalMapper>
#include <QMessageBox>
#include <QGridLayout>
#include <QPushButton>
#include <QWidget>MainWin::MainWin(QWidget *parent): QMainWindow(parent)
{signalMapper = new QSignalMapper(this);QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";//10个buttonQStringList texts = buttontext.split(",");QGridLayout *gridLayout = new QGridLayout();QWidget* cenWidget = new QWidget();//addthis->setCentralWidget(cenWidget); //addfor (int i = 0; i < texts.size(); ++i){QPushButton *button = new QPushButton(texts[i]);connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));signalMapper->setMapping (button, texts[i]);gridLayout->addWidget(button, i / 3, i % 3);}connect(signalMapper, SIGNAL(mapped (const QString &)), this, SLOT(doClicked(const QString &)));//setLayout(gridLayout);cenWidget->setLayout(gridLayout);//add
}MainWin::~MainWin()
{}void MainWin::doClicked(const QString &btnname)
{QMessageBox::information(this, "Clicked", btnname + " is clicked!");//显示被按下的btn名称。
}

再次编译运行如图:

说明:
应该还可以修改继承的QMainWindow 改成QWidget 来解决问题,但是如果非要要QMainWindow上述的方法应该是一个方案。

QMainWindow setLayout无效相关推荐

  1. qt布局 setlayout无效

    操作步骤:qt生产带ui的界面文件中使用setlayout无效 原因分析:ui文件默认带有layout,需要删除之后再设置setlayout才可用 删除方法可参考如下:(qt帮助手册有) void c ...

  2. QT中setLayout无效的问题

    在QT开发过程中,有时候会遇到这样的问题,当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件, ...

  3. 如何在QMainWindow里使用setLayout()函数

    QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法. #include "mainwindow.h" ...

  4. Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog)

    Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog.csdn.net/ ...

  5. Python Qt GUI设计:QMainWindow、QWidget和QDialog窗口类(基础篇—10)

    目录 1. QMainWindow窗口 2.QWidget窗口 3.QDialog窗口 3.1.QMessageBox窗口 3.2.QInputDialog窗口 3.3.QFontDialog窗口 3 ...

  6. QMainWindow中的布局管理

    给QWidget或者QDialog设置布局的时候方式很简单.创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就 ...

  7. openopc.opcerror: dispatch: 无效的类字符串_实战PyQt5: 064-MV框架中的Model类

    模型(Model)简介 在Model-View框架中,模型(Model)为视图(View)和委托(Delegate)使用数据提供了标准接口.大多数情况下模型中并不真正存储数据(如果只有少量的数据,可以 ...

  8. PyQt5学习--基本窗口控件--QMainWindow

    参考书籍<PyQt5 快速开发与实战>王硕 孙洋洋 著 QMainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件.比如将工具栏.菜单栏和状态栏等添加到布 ...

  9. QMainWindow

    欢迎加入QQ群:853840665,群内分享大量资料,供大家学习 描述:QMainWindow类提供了一个主应用程序窗口. Qt Main Window框架 主窗口为构建应用程序的用户界面提供了一个框 ...

最新文章

  1. JVM知识点总览:高级Java工程师面试必备
  2. C++程序的单元测试
  3. 教你怎么获得ICM会员ID解析.xxx域名(membership id icm)
  4. ftk学习记(输入法篇)
  5. 因下面文的损坏或丢失windows/system32/config/system 解决方法
  6. asp.net性能优化之使用Redis缓存(入门)
  7. 学习笔记_vnpy实战培训day03
  8. “马赛克”真能去除了?老司机狂喜!这一神器一键去除!
  9. 虚拟机与本机可以互ping,但是Xshell连不上虚拟机 的解决方法
  10. 国产品牌积极布局,游戏手机会是行业增长新风口吗?
  11. Jetpack 架构组件:LiveData
  12. 影像数据的分辨率与比例尺关系
  13. VM虚拟机安装使用OBS直播录屏软件图文教程及注意事项
  14. 报错:Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource [group/oneo
  15. Awesome Free ChatGPT(免费的chatgpt镜像网站)
  16. python:彩色照转黑白照
  17. 常识-idea里鼠标左键选择变成矩形块
  18. PADS 原理图/PCB常见错误及DRC报告网络问题
  19. 七年级计算机基本结构,七年级信息技术教案7-2.2 第二节 计算机的基本组成及工作原理...
  20. 如何自己实现一个scrapy框架——框架完善(四)

热门文章

  1. 持续绩效管理最佳闭环
  2. 遇到个RestTemplate接收 application/octet-stream的问题
  3. OPENSSL-DES算法
  4. 心灵鸡汤-迷茫-困惑-付出没有得到回报
  5. 【拆解】支付宝盒,支付宝到账100万!
  6. MQ如何保证分布式事务的最终一致性
  7. python 黑盒测试_处理Python导入黑盒
  8. springboot毕设项目java学习平台m55rv(java+VUE+Mybatis+Maven+Mysql)
  9. 干货 :假设检验中的第一类错误和第二类错误
  10. 前端百题斩【031】——从渲染流程认识重绘和回流