Найти - Пользователи
Полная версия: PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.
Начало » GUI » PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.
1
Pluto
import sys
from PyQt4 import QtGui, QtCore
class mwindow(QtGui.QWidget):
    def __init__(sf, title):
        QtGui.QWidget.__init__(sf)
        sf.setWindowTitle(title)
        sf.resize(400, 400)
        sf.layout = QtGui.QVBoxLayout()
        sf.setLayout(sf.layout)
        sf.unusebutton = QtGui.QPushButton()
        sf.layout.addWidget(sf.unusebutton)
        sf.layout.addStretch()
        sf.unusebutton.clicked.connect(sf.btnclicked)
        print(sf.unusebutton.rect())
    def btnclicked(sf):
        popup = Popup(sf)
        popup.show()
class Popup(QtGui.QWidget):
        def __init__(sf, parent):
            QtGui.QWidget.__init__(sf, parent)
            sf.setWindowFlags(QtCore.Qt.Popup) 
            
            sf.lay = QtGui.QVBoxLayout()
            sf.lay.addWidget(QtGui.QLabel("Ахалай-махалай!"))
            sf.setLayout(sf.lay)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    frame = mwindow("Махалай-ахалай")
    frame.show()
    sys.exit(app.exec_())

Почему print(sf.unusebutton.rect()) возвращает координаты виджета как 0, 0? Почему его размеры (если я не укажу их в программе при помощи resize) 640х480?

Мне нужно: при нажатии на эту кнопочку выдать всплывающее окно ровно под кнопочкой и длиною в эту кнопочку. Для этого мне нужно как-то заполучить координаты для метода move для этого окна и размеры кнопочки, чтобы выставить соответствующую длину окну. А как это сделать-то?
Pluto
Ага! print(sf.unusebutton.rect()) нужно поместить в метод btnclicked, тогда он вернёт текущие размеры кнопочки. А в методе __init__ видимо размеры кнопочки ещё не определены, чтобы их считывать.

Но начальные координаты-то кнопочки почему 0,0???? Как мне всплывающее окно помещать под кнопочку, если у кнопочки координаты почему-то 0,0 (начало экрана)?
Pluto
Решение:
import sys
from PyQt4 import QtGui, QtCore
class mwindow(QtGui.QWidget):
    def __init__(sf, title):
        QtGui.QWidget.__init__(sf)
        sf.setWindowTitle(title)
        sf.resize(400, 400)
        sf.layout = QtGui.QVBoxLayout()
        sf.setLayout(sf.layout)
        sf.unusebutton = QtGui.QPushButton()
        sf.layout.addWidget(sf.unusebutton)
        sf.layout.addStretch()
        sf.unusebutton.clicked.connect(sf.btnclicked)
        
    def btnclicked(sf):
        popup = Popup(sf)
        popup.show()
        
class Popup(QtGui.QWidget):
        def __init__(sf, parent):
            QtGui.QWidget.__init__(sf, parent)
            sf.setWindowFlags(QtCore.Qt.Popup)
            # ===
            rect = parent.unusebutton.rect() # отсюда можно получить длину и высоту виджета
            pointXY = parent.unusebutton.mapToGlobal(QtCore.QPoint(0, 0)) # данный метод позволяет получить абсолютные координаты виджета
            x = pointXY.x()
            y = pointXY.y() + rect.height() # увеличиваем значение будущей координаты всплывающего окна на высоту кнопки под которой будет появляться окно
            sf.move(x, y) # выполняем позиционирование всплывающего окна
            sf.resize(rect.width(), 20) # изменяем его длину, делая её равной длине кнопки
            # ===
            sf.lay = QtGui.QVBoxLayout()
            sf.lay.addWidget(QtGui.QLabel("Ахалай-махалай!"))
            sf.setLayout(sf.lay)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    frame = mwindow("Махалай-ахалай")
    frame.show()
    sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB