Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет. [RSS Feed]

#1 Окт. 20, 2014 08:22:26

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.

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 (Окт. 20, 2014 08:27:33)

Офлайн

#2 Окт. 20, 2014 08:33:07

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.

Ага! print(sf.unusebutton.rect()) нужно поместить в метод btnclicked, тогда он вернёт текущие размеры кнопочки. А в методе __init__ видимо размеры кнопочки ещё не определены, чтобы их считывать.

Но начальные координаты-то кнопочки почему 0,0???? Как мне всплывающее окно помещать под кнопочку, если у кнопочки координаты почему-то 0,0 (начало экрана)?

Офлайн

#3 Окт. 20, 2014 13:12:39

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.

Решение:

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

Офлайн

  • Начало
  • » GUI
  • » PyQt4. Получить размер и координаты виджета, чтобы на основе их расположить другой виджет.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version