QMainWindow setLayout无效
提出问题:
- 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
- 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无效相关推荐
- qt布局 setlayout无效
操作步骤:qt生产带ui的界面文件中使用setlayout无效 原因分析:ui文件默认带有layout,需要删除之后再设置setlayout才可用 删除方法可参考如下:(qt帮助手册有) void c ...
- QT中setLayout无效的问题
在QT开发过程中,有时候会遇到这样的问题,当我们自己创建了一个Layout对象以后,使用QWidget的setLayout方法,将这个Layout对象应用到窗口中的时候,发现窗口上没有我们添加的控件, ...
- 如何在QMainWindow里使用setLayout()函数
QMainWindow并没有setLayout()函数,因此不能使用setLayout()函数来设置layout,需要使用间接的方法. #include "mainwindow.h" ...
- Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog)
Python3 PyQt5 窗口(国际化/QMainWindow/QWidget/QDialog) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog.csdn.net/ ...
- Python Qt GUI设计:QMainWindow、QWidget和QDialog窗口类(基础篇—10)
目录 1. QMainWindow窗口 2.QWidget窗口 3.QDialog窗口 3.1.QMessageBox窗口 3.2.QInputDialog窗口 3.3.QFontDialog窗口 3 ...
- QMainWindow中的布局管理
给QWidget或者QDialog设置布局的时候方式很简单.创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就 ...
- openopc.opcerror: dispatch: 无效的类字符串_实战PyQt5: 064-MV框架中的Model类
模型(Model)简介 在Model-View框架中,模型(Model)为视图(View)和委托(Delegate)使用数据提供了标准接口.大多数情况下模型中并不真正存储数据(如果只有少量的数据,可以 ...
- PyQt5学习--基本窗口控件--QMainWindow
参考书籍<PyQt5 快速开发与实战>王硕 孙洋洋 著 QMainWindow主窗口为用户提供一个应用程序框架,它有自己的布局,可以在布局中添加控件.比如将工具栏.菜单栏和状态栏等添加到布 ...
- QMainWindow
欢迎加入QQ群:853840665,群内分享大量资料,供大家学习 描述:QMainWindow类提供了一个主应用程序窗口. Qt Main Window框架 主窗口为构建应用程序的用户界面提供了一个框 ...
最新文章
- JVM知识点总览:高级Java工程师面试必备
- C++程序的单元测试
- 教你怎么获得ICM会员ID解析.xxx域名(membership id icm)
- ftk学习记(输入法篇)
- 因下面文的损坏或丢失windows/system32/config/system 解决方法
- asp.net性能优化之使用Redis缓存(入门)
- 学习笔记_vnpy实战培训day03
- “马赛克”真能去除了?老司机狂喜!这一神器一键去除!
- 虚拟机与本机可以互ping,但是Xshell连不上虚拟机 的解决方法
- 国产品牌积极布局,游戏手机会是行业增长新风口吗?
- Jetpack 架构组件:LiveData
- 影像数据的分辨率与比例尺关系
- VM虚拟机安装使用OBS直播录屏软件图文教程及注意事项
- 报错:Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource [group/oneo
- Awesome Free ChatGPT(免费的chatgpt镜像网站)
- python:彩色照转黑白照
- 常识-idea里鼠标左键选择变成矩形块
- PADS 原理图/PCB常见错误及DRC报告网络问题
- 七年级计算机基本结构,七年级信息技术教案7-2.2 第二节 计算机的基本组成及工作原理...
- 如何自己实现一个scrapy框架——框架完善(四)