Позиция QDialog в ModelIndex нажата - PullRequest
0 голосов
/ 07 января 2019

Как правильно расположить всплывающее диалоговое окно под ModelIndex, щелкнувшим в QTreeView. Положение X, ширина и высота всплывающего диалога отображаются правильно. Однако позиция Y, кажется, не может быть правильной. Что я делаю не так?

enter image description here

enter image description here

import os, sys, pprint
from Qt import QtGui, QtWidgets, QtCore


class Window(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.resize(800, 400)

        self.uiSearch = QtWidgets.QLineEdit()
        self.uiItems = QtWidgets.QTreeView()
        self.uiItems.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.uiItems.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.uiItems.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
        self.uiItems.setModel(QtGui.QStandardItemModel())

        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.uiSearch)
        self.layout.addWidget(self.uiItems)
        self.setLayout(self.layout)

        for i in range(10):
            col1 = QtGui.QStandardItem('Item' + str(i))
            col2 = QtGui.QStandardItem('Item' + str(i))
            col3 = QtGui.QStandardItem('Item' + str(i))
            self.uiItems.model().appendRow([col1,col2,col3])

        self.uiItems.clicked.connect(self.clickedItem)


    def clickedItem(self, index):
        print index
        if index.isValid():
            rect = self.uiItems.visualRect(index)
            pos = self.uiItems.mapToGlobal(rect.bottomLeft())

            # create editor
            dlg = QtWidgets.QDialog(self)
            dlg.setWindowFlags(QtCore.Qt.Popup)
            dlg.resize(rect.width(), 100)
            dlg.move(pos)
            dlg.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Window()
    ex.show()
    app.exec_()

1 Ответ

0 голосов
/ 07 января 2019

visualRect() относится к viewport(), а не к QTreeView (QTreeView - заголовки + область просмотра):

def clickedItem(self, index):
    if index.isValid():
        rect = self.uiItems.visualRect(index)
        pos = self.uiItems.viewport().mapToGlobal(rect.bottomLeft())
        # create editor
        dlg = QtWidgets.QDialog(self)
        dlg.setWindowFlags(QtCore.Qt.Popup)
        dlg.resize(rect.width(), 100)
        dlg.move(pos)
        dlg.show()
...