2011-04-15 24 views
18

Estoy intentando averiguar cómo hacer una línea horizontal en Qt. Esto es fácil de crear en Designer, pero quiero crear uno programáticamente. He hecho un poco de googlear y he mirado el xml en un archivo ui pero no he podido descifrar nada.Cómo hacer una línea horizontal mediante programación en Qt

Esto es lo que el XML del archivo de interfaz de usuario se parece a:

<widget class="Line" name="line"> 
    <property name="geometry"> 
    <rect> 
    <x>150</x> 
    <y>110</y> 
    <width>118</width> 
    <height>3</height> 
    </rect> 
    </property> 
    <property name="orientation"> 
    <enum>Qt::Horizontal</enum> 
    </property> 
    </widget> 

Respuesta

31

una línea horizontal o vertical es sólo un QFrame con algunas propiedades establecidas. En C++, el código que se genera para crear una línea tiene este aspecto:

line = new QFrame(w); 
line->setObjectName(QString::fromUtf8("line")); 
line->setGeometry(QRect(320, 150, 118, 3)); 
line->setFrameShape(QFrame::HLine); 
line->setFrameShadow(QFrame::Sunken); 
+1

son '' setGeometry' y setFrameShadow' realmente necesario? Todavía soy bastante nuevo en Qt, pero esperaría que el estilo de la sombra de cuadros, de forma predeterminada, dependa del estilo general de Qt UI. Estoy tratando de escribir multiplataforma aquí. –

+1

@MichaelScheper no son las únicas llamadas necesarias 'setFrameShape()' y 'setFrameShadow()'. –

13

Mi solución en PyQt:

(...) 
mainLayout.addWidget(self.HLine()) 
(...) 
def HLine(self): 
    toto = QFrame() 
    toto.setFrameShape(QFrame.HLine) 
    toto.setFrameShadow(QFrame.Sunken) 
    return toto 

def VLine(self): 
    toto = QFrame() 
    toto.setFrameShape(QFrame.VLine) 
    toto.setFrameShadow(QFrame.Sunken) 
    return toto 
+0

¡Genial! me ayudo mucho. Aunque debería ser 'mainLayout.addWidget (self.HLine())' –

5

Aquí hay otra solución utilizando PySide:

from PySide.QtGui import QFrame 


class QHLine(QFrame): 
    def __init__(self): 
     super(QHLine, self).__init__() 
     self.setFrameShape(QFrame.HLine) 
     self.setFrameShadow(QFrame.Sunken) 


class QVLine(QFrame): 
    def __init__(self): 
     super(QVLine, self).__init__() 
     self.setFrameShape(QFrame.VLine) 
     self.setFrameShadow(QFrame.Sunken) 

¿Qué se puede luego se usará como (por ejemplo):

from PySide.QtGui import QApplication, QWidget, QGridLayout, QLabel, QComboBox 


if __name__ == "__main__": 
    app = QApplication([]) 
    widget = QWidget() 
    layout = QGridLayout() 

    layout.addWidget(QLabel("Test 1"), 0, 0, 1, 1) 
    layout.addWidget(QComboBox(), 0, 1, 1, 1) 
    layout.addWidget(QHLine(), 1, 0, 1, 2) 
    layout.addWidget(QLabel("Test 2"), 2, 0, 1, 1) 
    layout.addWidget(QComboBox(), 2, 1, 1, 1) 

    widget.setLayout(layout) 
    widget.show() 
    app.exec_() 

que se traduce en lo siguiente:

Example of QHLine on Windows 10

Cuestiones relacionadas