转自: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间的位置重叠的更多相关文章

  1. vue中兄弟组件间通讯

    vue2.0中兄弟组件间的通讯是通过eventBus(事件发布订阅)实现的. eventBus.js import Vue from 'vue' const eventBus = new Vue() ...

  2. Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化

    一,  兄弟组件间联动 1.  点击城市字母,左侧对应显示 给遍历的 字母 添加一个点击事件: Alphabet.vue @click="handleLetterClick" ha ...

  3. Vue2不使用Vuex如何实现兄弟组件间的通信

    在一些正规的大型项目的企业级开发过程中我们一般会引入Vuex来对Vue所有组件进行状态管理,可以轻松实现各组件间的通信.但是有时候做做自己的小项目,没有必要使用Vuex时,如何简单的实现组件间的通信? ...

  4. Vue-组件传值:子传父和兄弟组件间常见的传值方式

    前言 上篇介绍了我对vue组件化的理解和父组件对子组件传值的方式,这篇介绍下常见的子传父和兄弟组件间的传值方式 目录 子组件向父组件传值 任意组件间的传值方式 正文 子组件向父组件传值 关键知识点:$ ...

  5. vue中兄弟组件间 的传值 bus(可以理解为公共交通)

    点击大儿子(头部组件的年月日,下面的都要变化) 就相当于点击了年月日之后,下面的组件重新调接口,参数变化       1.首先随便哪儿写个bus.js 内容如下: import Vue from 'v ...

  6. C语言使用memcpy函数实现两个数间任意位置的复制操作

    c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 用法:void *memcpy(void *dest ...

  7. Vue 使用eventBus 实现兄弟组件间的通信

    实现方式:  主要是在相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发事件广播 和监听来实现通信和参数传递. 需求: a页面tree的增删改后,数据还是之前的老数据 ...

  8. Exchanger兄弟线程间数据信息交换

    一.简述 Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用 ...

  9. Vue中兄弟组件间传值-(Bus/总线/发布订阅模式/观察者)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

    群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_ ...

  2. select菜单实现二级联动

    <tr> <th>执行人<b>*</b></th> <td> <select name="jdcld.ZXDW& ...

  3. Shell 获取当前时间

    #! /bin/bash time=`date '+%Y-%m-%d %H:%M:%S'` # echo $time sql='SELECT `username`, `password` FROM ` ...

  4. C#中接口和抽象类

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  5. 使用out来返回多个值

    一般的方法中,一次只能有一个返回值.但是当我们需要一个方法给我们返回多个值得时候应该怎么做呢?这时候可以使用out来修饰参数. out介绍: static void Main(string[] arg ...

  6. oracle 关于动态执行语句 execute immediate 的用法

    当在开发的应用场景中 数据库处理复杂业务逻辑里用到 SQL 语句拼接    可以用  execute immediate   来执行语 举个例子 insert into tb_temp_public( ...

  7. AmazeUI 模态框封装

    /** * 模态窗口 */ window.Modal = { tpls:{ alert:'<div class="am-modal am-modal-alert" tabin ...

  8. centos6 x86 安装 oracle 11g2r 日志

    一.安装centos 6.5 二.安装ora所需的库 三.修改centos内核 四.建用户组和目录结构等 五.安装ora11g2r 六.安装sqlplus的翻页程序和help补丁 七.自启动脚本 八. ...

  9. 牛顿法与拟牛顿法,DFP法,BFGS法,L-BFGS法

    牛顿法 考虑如下无约束极小化问题: $$\min_{x} f(x)$$ 其中$x\in R^N$,并且假设$f(x)$为凸函数,二阶可微.当前点记为$x_k$,最优点记为$x^*$. 梯度下降法用的是 ...

  10. Javascript数组方法探究一二

    1. Array.prototype.slice方法 数组的 slice 方法通常用来从一个数组中抽取片断.不过,它还有将“类数组”(比如arguments和​HTMLCollection​)转换为真 ...