关于兄弟QWidget间的位置重叠
转自:http://hi.baidu.com/dbzhang800/item/a7bf1f1e983c6af964eabf45?qq-pf-to=pcqq.group
缘起
csdn上一用户抱怨:她的 connectSlotsByName 不起作用,给出的证据如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QPushButton *btn=new QPushButton(this);
btn->setObjectName("TestButton");
btn->setText("test");
btn->setGeometry(50,70,100,150);
QMetaObject::connectSlotsByName(this);
ui->setupUi(this);
}
MainWindow头文件中将on_TestButton_clicked声名为槽,实现文件中如下:
public slots:
void MainWindow::on_TestButton_clicked()
{
QObject *obj=sender();
qDebug("TestButton is clicked);
}初步分析
首先我们看到,QPushButton的用法存在问题。我们知道 QMainWindow是由菜单栏、工具栏、状态栏、中心Widget、停靠Widget等构成的,QMainWindow的使用就是使用这些部件。这儿他创建了QMainWindow 的直接子对象,而不是放到中心Widget或停靠Widget中。
但是,尽管违背了QMainWindow原则,由于QMainWindow只不过是QWidget的子类,所以从QWidget角度看,还是不应该出现这个楼主的抱怨才对。但测试了一下:确实有问题,QPushButton不响应鼠标事件(去掉中心Widget后按钮正常)。
一开始脑袋发昏,考虑了一下:是不是QMainWindow为其他子对象设置的事件过滤器呢?按该思路走,未果。
然后回归正途:中心Widget和这儿手动布局的QPushButton位置重合!
什么状况
多个的同级 Widget 位置重合了,怎么办?谁先谁后?谁在上面?
到这儿其实就很简单了,调整顺序,相关的成员函数:
- QWidget::stackUnder
- QWidget::raise
- QWidget::lower
然后,对于这个问题, 解决起来就很简单了。只需在构造函数的最后,加一行:
btn->raise();
即可。(注意:本文的目的是指告诉你为什么会出现这种问题。要从根本上解决问题,请老老实实按QMainWindow的用法使用;如果像本文这样用的话,其实就没必要用QMainWindow了,因为也发挥不了QMainWindow的威力。)
完整的例子
import sys
from PySide import QtGui
app = QtGui.QApplication(sys.argv)
p = QtGui.QWidget()
p.resize(400, 300)
c1 = QtGui.QPushButton("Push", p)
c2 = QtGui.QWidget(p)
c1.setGeometry(0, 0, 200, 200)
c2.setGeometry(0, 0, 200, 200)
#c1.raise_()
#c2.lower()
p.show()
sys.exit(app.exec_())
c1(按钮) 和 c2(普通的Widget) 是同级Widget,先创建的c1会被后创建的c2覆盖,要让c1在上面,需要调整二者在父对象堆栈中的顺序。c1上升或c2下降。
http://blog.csdn.net/zzwdkxx/article/details/38979165
关于兄弟QWidget间的位置重叠的更多相关文章
- vue中兄弟组件间通讯
vue2.0中兄弟组件间的通讯是通过eventBus(事件发布订阅)实现的. eventBus.js import Vue from 'vue' const eventBus = new Vue() ...
- Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化
一, 兄弟组件间联动 1. 点击城市字母,左侧对应显示 给遍历的 字母 添加一个点击事件: Alphabet.vue @click="handleLetterClick" ha ...
- Vue2不使用Vuex如何实现兄弟组件间的通信
在一些正规的大型项目的企业级开发过程中我们一般会引入Vuex来对Vue所有组件进行状态管理,可以轻松实现各组件间的通信.但是有时候做做自己的小项目,没有必要使用Vuex时,如何简单的实现组件间的通信? ...
- Vue-组件传值:子传父和兄弟组件间常见的传值方式
前言 上篇介绍了我对vue组件化的理解和父组件对子组件传值的方式,这篇介绍下常见的子传父和兄弟组件间的传值方式 目录 子组件向父组件传值 任意组件间的传值方式 正文 子组件向父组件传值 关键知识点:$ ...
- vue中兄弟组件间 的传值 bus(可以理解为公共交通)
点击大儿子(头部组件的年月日,下面的都要变化) 就相当于点击了年月日之后,下面的组件重新调接口,参数变化 1.首先随便哪儿写个bus.js 内容如下: import Vue from 'v ...
- C语言使用memcpy函数实现两个数间任意位置的复制操作
c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 用法:void *memcpy(void *dest ...
- Vue 使用eventBus 实现兄弟组件间的通信
实现方式: 主要是在相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发事件广播 和监听来实现通信和参数传递. 需求: a页面tree的增删改后,数据还是之前的老数据 ...
- Exchanger兄弟线程间数据信息交换
一.简述 Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用 ...
- Vue中兄弟组件间传值-(Bus/总线/发布订阅模式/观察者)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- JavaScript使用需要注意的细节
1.JavaScript区分大小写 在JavaScript中对象,变量.函数都是区分大小写的,例如: Object表示对象,Arrary表示数组,而写成object,arrary的时候JavaScri ...
- JSON字符串与JSON对象的区别及转换
JSON对象是直接可以使用JQuery操作的格式,和js中的对象一样,可以用对象(类名)点出属性(方法). JSON字符串仅仅只是一个字符串,一个整体,不截取的话没办法取出其中存储的数据,不能直接使用 ...
- 使用Dreamwaver cc中的SVN功能,用于传输BAE和SAE中的文件
前沿: 假期使用BAE和SAE开发应用,两个服务器都需要通过SVN提交代码,因为平时大多使用Dreamwaver,所以查了查资料,通过Subversion方便了开发. 因为网上的资料都不全,所以根据自 ...
- Qt 学习之路 :Qt 线程相关类
希望上一章有关事件循环的内容还没有把你绕晕.本章将重新回到有关线程的相关内容上面来.在前面的章节我们了解了有关QThread类的简单使用.不过,Qt 提供的有关线程的类可不那么简单,否则的话我们也没必 ...
- [Android] Service和IntentService中显示Toast的区别
1. 表象 Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失. 2. ...
- 网络环境场景以及模拟工具netem
网络环境场景包括: 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况. 掉包(Drop),随机丢弃一些数据. 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的 ...
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- H.264视频在android手机端的解码与播放(转)
随着无线网络和智能手机的发展,智能手机与人们日常生活联系越来越紧密,娱乐.商务应用.金融应用.交通出行各种功能的软件大批涌现,使得人们的生活丰富多彩.快捷便利,也让它成为人们生活中不可取代的一部分.其 ...
- 转:android 自定义RadioButton样式
http://gundumw100.iteye.com/blog/1146527 上面这种3选1的效果如何做呢?用代码写? 其实有更简单的办法,忘了RadioButton有什么特性了吗? 我就用Ra ...
- ASP.NET5中间件
小的应用组件可以包含到Http请求管道当中,ASP.NET5 集成了中间件,被包在了应用程序的Configure方法当中. 1. 什么是中间件 中间件是一组被装到应用程序管道的请求和响应中的组件.每一 ...