Форум сайта python.su
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_())
Отредактировано Pluto (Окт. 20, 2014 08:27:33)
Офлайн
Ага! print(sf.unusebutton.rect()) нужно поместить в метод btnclicked, тогда он вернёт текущие размеры кнопочки. А в методе __init__ видимо размеры кнопочки ещё не определены, чтобы их считывать.
Но начальные координаты-то кнопочки почему 0,0???? Как мне всплывающее окно помещать под кнопочку, если у кнопочки координаты почему-то 0,0 (начало экрана)?
Офлайн
Решение:
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_())
Офлайн