Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在主窗口的中心位置打开QDialog小部件_Python_Pyqt5 - Fatal编程技术网

Python 如何在主窗口的中心位置打开QDialog小部件

Python 如何在主窗口的中心位置打开QDialog小部件,python,pyqt5,Python,Pyqt5,我正在寻找一种方法来打开主窗口中心位置的QDialog小部件。 我已将主窗口的位置设置为居中 centerPoint = qtw.QDesktopWidget().availableGeometry().center() qtRectangle.moveCenter(centerPoint) 将对话框小部件折叠到主窗口的位置 我已经设定好了 msgb.move(self.pos().x(), self.pos().y()) 对话框窗口跟随主窗口的位置,但它在主窗口的左上方打

我正在寻找一种方法来打开主窗口中心位置的
QDialog小部件
。 我已将主窗口的位置设置为居中

 centerPoint = qtw.QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
将对话框小部件折叠到主窗口的位置 我已经设定好了

msgb.move(self.pos().x(), self.pos().y())
对话框窗口跟随主窗口的位置,但它在主窗口的左上方打开,如何将其位置更改为主窗口的中心

#!/usr/bin/env python

"""
startscreen

base window remit to specific tests

"""

import os
import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc




class Startscreen(qtw.QWidget):
    '''
    remit to one of three tests if widgets toggled/clicked
    hide its self after
    '''

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # your code will go here

        # interface

        # position
        qtRectangle = self.frameGeometry()
        centerPoint = qtw.QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
        self.move(qtRectangle.topLeft())
        # size
        self.resize(700, 410)
        # frame title
        self.setWindowTitle("Lambda")

        # heading
        heading_label = qtw.QLabel("Lambda Version 1.0")
        heading_label.setAlignment(qtc.Qt.AlignHCenter)

        # active user
        activeuser_label = qtw.QLabel('Benutzer: ' + os.getlogin())
        activeuser_label.setStyleSheet("background-color: rgb(234, 246, 22)")
        activeuser_label.setAlignment(qtc.Qt.AlignRight | qtc.Qt.AlignTop)

        # groubox for widget positioning
        self.groupbox = qtw.QGroupBox(self)
        # groupbox.setAlignment(qtc.Qt.AlignHCenter)

        # layout and widgets
        vlayout = qtw.QVBoxLayout()
        vlayout.setAlignment(qtc.Qt.AlignHCenter)

        self.particlesize_radiobutton = qtw.QRadioButton("test1")
        vlayout.addWidget(self.particlesize_radiobutton)
        self.dimensionalchange_radiobutton = qtw.QRadioButton("test2")
        vlayout.addWidget(self.dimensionalchange_radiobutton)
        self.dimensionalchangecook_radiobutton = qtw.QRadioButton("test3")
        vlayout.addWidget(self.dimensionalchangecook_radiobutton)
        self.select_button = qtw.QPushButton('select')
        vlayout.addWidget(self.select_button)

        self.groupbox.setLayout(vlayout)

        # mainlayout
        main_layout = qtw.QFormLayout()
        main_layout.addRow(activeuser_label)
        main_layout.addRow(heading_label)
        main_layout.setVerticalSpacing(40)
        main_layout.addRow(self.groupbox)

        self.setLayout(main_layout)

        # functionality
        self.select_button.clicked.connect(self.open_box)


        self.show()


    def open_box(self):
        msgb = qtw.QMessageBox()
        msgb.setWindowTitle("title")
        msgb.setText("hier sthet was")
        msgb.move(self.pos().x(), self.pos().y())
        run = msgb.exec_()

        # msgb = qtw.QMessageBox()
        # msgb.addButton()
        # if x open new windwo
        #



if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = Startscreen()
    sys.exit(app.exec_())



一个小部件相对于其父部件有一个位置,如果它没有父部件,那么它将相对于屏幕。对于msgb,它属于第二种情况,因此必须将窗口中心的坐标转换为全局坐标(即相对于屏幕)。即使执行上述操作,它也不会居中,因为位置是相对于左上角的,也就是说,msgb左上角将位于屏幕的中心,这是不可取的,因此您还必须考虑msgb的大小。msgb显示前后的大小不同,因此使用QTimer就足够了:

def open_box(self):
    msgb = qtw.QMessageBox()
    msgb.setWindowTitle("title")
    msgb.setText("hier sthet was")
    qtc.QTimer.singleShot(
        0,
        lambda: msgb.move(
            self.mapToGlobal(self.rect().center() - msgb.rect().center())
        ),
    )
    run = msgb.exec_()
def打开_盒(自身):
msgb=qtw.QMessageBox()
msgb.setWindowTitle(“标题”)
msgb.setText(“hier sthet was”)
qtc.QTimer.singleShot(
0,
lambda:msgb.move(
self.mapToGlobal(self.rect().center()-msgb.rect().center())
),
)
run=msgb.exec\ux()