2011-04-15 201 views
18

我在弄清楚如何在Qt中制作水平线。这很容易在Designer中创建,但我想以编程方式创建一个。我已经做了一些googleing,并查看了ui文件中的xml,但一直没能弄清楚什么。如何以编程方式在Qt中制作水平线

这是从UI文件的XML看起来像:

<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> 

回答

31

水平或垂直线只是一个QFrame一些属性进行设置。在C++中,其被生成以创建一个行代码如下所示:

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

是'setGeometry'实际上'setFrameShadow'有必要吗?我对Qt仍然很陌生,但我希望默认情况下,frame shadow的风格取决于整体Qt UI风格。我正在尝试在这里编写跨平台。 – 2016-01-25 01:13:24

+1

@MichaelScheper没有必要的唯一调用是'setFrameShape()'和'setFrameShadow()'。 – 2016-12-09 20:34:20

13

我在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

太棒了!帮了我很多。虽然它应该是'mainLayout.addWidget(self.HLine())' – 2017-11-17 12:24:47

5

下面是使用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) 

可然后用作(例如):

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_() 

导致以下:

Example of QHLine on Windows 10