zoukankan      html  css  js  c++  java
  • 关于兄弟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

  • 相关阅读:
    MT【160】格点
    MT【159】单调有界有极限
    c_str() 函数
    C strstr() 函数
    全面总结:matlab怎么做漂亮的图
    程序员电邮札记
    C编译: 使用gdb调试
    C编译: 动态连接库 (.so文件)
    C编译: makefile基础
    数据科学
  • 原文地址:https://www.cnblogs.com/findumars/p/5805066.html
Copyright © 2011-2022 走看看