關於兄弟QWidget間的位置重疊

2021-06-25 08:30:21 字數 1450 閱讀 2404

**: 緣起

csdn上一使用者抱怨:她的 connectslotsbyname 不起作用,給出的證據如下:

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow標頭檔案中將on_testbutton_clicked聲名為槽,實現檔案中如下:

public slots:

void mainwindow::on_testbutton_clicked()

初步分析

首先我們看到,qpushbutton的用法存在問題。我們知道 qmainwindow是由選單欄、工具欄、狀態列、中心widget、停靠widget等構成的,qmainwindow的使用就是使用這些部件。這兒他建立了qmainwindow 的直接子物件,而不是放到中心widget或停靠widget中。

但是,儘管違背了qmainwindow原則,由於qmainwindow只不過是qwidget的子類,所以從qwidget角度看,還是不應該出現這個樓主的抱怨才對。但測試了一下:確實有問題,qpushbutton不響應滑鼠事件(去掉中心widget後按鈕正常)。

一開始腦袋發昏,考慮了一下:是不是qmainwindow為其他子物件設定的事件過濾器呢?按該思路走,未果。

然後回歸正途:中心widget和這兒手動布局的qpushbutton位置重合!

什麼狀況

多個的同級 widget 位置重合了,怎麼辦?誰先誰後?誰在上面?

到這兒其實就很簡單了,調整順序,相關的成員函式:

然後,對於這個問題, 解決起來就很簡單了。只需在建構函式的最後,加一行:

btn->raise();

即可。(注意:本文的目的是指告訴你為什麼會出現這種問題。要從根本上解決問題,請老老實實按qmainwindow的用法使用;如果像本文這樣用的話,其實就沒必要用qmainwindow了,因為也發揮不了qmainwindow的威力。)

完整的例子

import sys

from pyside import qtgui

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()

c1(按鈕) 和 c2(普通的widget) 是同級widget,先建立的c1會被後建立的c2覆蓋,要讓c1在上面,需要調整二者在父物件堆疊中的順序。c1上公升或c2下降。

vue的 on 和 emit 兄弟元件間通訊

建立乙個檔案bus.js 在裡面new 乙個vue例項 import vue from vue export var bus new vue 在元件中分別引入,建立的檔案vue例項 import from bus.js 在其中乙個元件中進行傳送 bus.emit steps1tosteps2 在另個...

關於os路徑的位置

記錄下os.path.dirname file 使用 os.path.dirname file 使用 該測試指令碼所在的位置 d 第1層 第2層 第3層 第4層 第5層 test11.py test11.py import os 該檔案所在位置 d 第1層 第2層 第3層 第4層 第5層 test1...

WPF 獲取控制項間的相對位置

wpf 獲取控制項間的相對位置 周銀輝 我們知道wpf有著比較靈活的布局方式,關於某個控制項的座標,canvas中的元素最簡單,我們可以直接通過其getleft 與gettop方法來獲取,但其它布局面板中的,以及存在於不同布局面板中的元素中間的相對位置就比較讓我們頭疼了,其實有簡單方法的,不知你有沒...