2014-09-11 2 views
0

Я создаю пользовательский QWidget, в котором у меня есть QGridLayout, и рисую прямоугольник на определенном элементе в сетке. Я также вручную рисую строки, чтобы очертить расположение элементов сетки (с QPainter.DrawLines).Картина на виджет, содержащий QGridLayout в PySide/PyQt

После рисования линий я затем рисую прямоугольник внутри одного из элементов сетки, с указанием его местоположения с помощью системы координат QGridLayout.

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

Я не нашел явного обсуждения этой проблемы через Google или SO.

Edit:

Примечание, как указано в принятом ответе, ошибка была с помощью сетки координат рисовать на сетке, когда я использую точку координаты (т.е. столбец, ряд). То есть ошибка в приведенном ниже коде состоит в том, что элемент в сетке имеет обратные координаты x и y.


from PySide import QtGui, QtCore 

class HighlightSquare(QtGui.QWidget): 
    def __init__(self, parent = None): 
     QtGui.QWidget.__init__(self, parent=None) 
     self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, 
             QtGui.QSizePolicy.Expanding))     
     self.setMinimumSize(self.minimumSizeHint()) 
     layout = QtGui.QGridLayout() 
     layout.addItem(QtGui.QSpacerItem(10,10), 0, 0) 
     layout.addItem(QtGui.QSpacerItem(10,10), 0, 1) 
     layout.addItem(QtGui.QSpacerItem(10,10), 1, 0) 
     layout.addItem(QtGui.QSpacerItem(10,10), 1, 1)  
     self.setLayout(layout) 
     self.resize(150, 150) 
     self.update() 

    def paintEvent(self, event = None): 
     painter = QtGui.QPainter(self) 
     painter.setRenderHint(QtGui.QPainter.Antialiasing) 
     winHeight=self.size().height(); heightStep=winHeight/2 
     winWidth=self.size().width(); widthStep=winWidth/2 

     #Draw lines 
     painter.setPen(QtCore.Qt.black) 
     for i in range(4): 
      #vertical lines 
      painter.drawLine(QtCore.QPoint(i*widthStep,0), QtCore.QPoint(i*widthStep, winHeight)) 
      #horizontal lines 
      painter.drawLine(QtCore.QPoint(0,heightStep*i), QtCore.QPoint(winWidth, heightStep*i)) 

     #Draw blue outline around box 1,1 
     highlightCoordinate=(1,1) 
     pen=QtGui.QPen(QtCore.Qt.blue, 3)   
     painter.setPen(pen) 
     coordHighlight=[QtCore.QPoint(highlightCoordinate[1]*heightStep, highlightCoordinate[0]*widthStep),\ 
         QtCore.QPoint(highlightCoordinate[1]*heightStep, (highlightCoordinate[0]+1)*widthStep),\ 
         QtCore.QPoint((highlightCoordinate[1]+1)*heightStep, (highlightCoordinate[0]+1)*widthStep),\ 
         QtCore.QPoint((highlightCoordinate[1]+1)*heightStep, highlightCoordinate[0]*widthStep),\ 
         QtCore.QPoint(highlightCoordinate[1]*heightStep, highlightCoordinate[0]*widthStep)] 
     #print coordHighlight 
     painter.drawPolyline(coordHighlight) 

    def minimumSizeHint(self): 
     return QtCore.QSize(120,120) 


if __name__=="__main__": 
    import sys 
    app=QtGui.QApplication(sys.argv) 
    myLight = HighlightSquare() 
    myLight.show() 
    sys.exit(app.exec_()) 

ответ

1

Вы читали определение конструктора класса QtCore.QPoint? По методу QPoint.__init__ (self, int xpos, int ypos) ваш код отменен (ypos, xpos). Я починил это.

import sys 
from PyQt4 import QtGui, QtCore 

class QHighlightSquareWidget (QtGui.QWidget): 
    def __init__ (self, parent = None): 
     QtGui.QWidget.__init__(self, parent = None) 
     self.setSizePolicy (
      QtGui.QSizePolicy (
       QtGui.QSizePolicy.Expanding, 
       QtGui.QSizePolicy.Expanding)) 
     self.setMinimumSize(self.minimumSizeHint()) 
     allQGridLayout = QtGui.QGridLayout() 
     allQGridLayout.addItem(QtGui.QSpacerItem(10,10), 0, 0) 
     allQGridLayout.addItem(QtGui.QSpacerItem(10,10), 0, 1) 
     allQGridLayout.addItem(QtGui.QSpacerItem(10,10), 1, 0) 
     allQGridLayout.addItem(QtGui.QSpacerItem(10,10), 1, 1)  
     self.setLayout(allQGridLayout) 
     self.resize(150, 150) 
     self.update() 

    def paintEvent (self, eventQPaintEvent): 
     myQPainter = QtGui.QPainter(self) 
     myQPainter.setRenderHint(QtGui.QPainter.Antialiasing) 
     winHeight = self.size().height() 
     heightStep = winHeight/2 
     winWidth = self.size().width() 
     widthStep = winWidth/2 

     myQPainter.setPen(QtCore.Qt.black) 
     for i in range(4): 
      myQPainter.drawLine(QtCore.QPoint(i * widthStep, 0   ), QtCore.QPoint(i * widthStep, winHeight )) 
      myQPainter.drawLine(QtCore.QPoint(0,    heightStep * i), QtCore.QPoint(winWidth,  heightStep * i)) 

     highlightCoordinate = (1, 1) 
     myQPen = QtGui.QPen(QtCore.Qt.blue, 3)   
     myQPainter.setPen(myQPen) 
     coordHighlight = [ 
      QtCore.QPoint(highlightCoordinate[0]  * widthStep, highlightCoordinate[1]  * heightStep), 
      QtCore.QPoint((highlightCoordinate[0] + 1) * widthStep, highlightCoordinate[1]  * heightStep), 
      QtCore.QPoint((highlightCoordinate[0] + 1) * widthStep, (highlightCoordinate[1] + 1) * heightStep), 
      QtCore.QPoint(highlightCoordinate[0]  * widthStep, (highlightCoordinate[1] + 1) * heightStep), 
      QtCore.QPoint(highlightCoordinate[0]  * widthStep, highlightCoordinate[1]  * heightStep)] 
     myQPainter.drawPolyline(*coordHighlight) 

    def minimumSizeHint (self): 
     return QtCore.QSize(120, 120) 

if __name__=="__main__": 
    myQApplication = QtGui.QApplication(sys.argv) 
    myQHighlightSquareWidget = QHighlightSquareWidget() 
    myQHighlightSquareWidget.show() 
    sys.exit(myQApplication.exec_()) 
Смежные вопросы