如何以编程方式在Qt中创建一条水平线

kee*_*n3d 23 python qt pyqt

我想弄清楚如何在Qt中制作一条水平线.这很容易在Designer中创建,但我想以编程方式创建一个.我做了一些googleing并查看了ui文件中的xml但却无法解决任何问题.

这是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>
Run Code Online (Sandbox Code Playgroud)

sho*_*osh 36

水平或垂直线只是设置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);
Run Code Online (Sandbox Code Playgroud)

  • @MichaelScheper 不需要,唯一需要的调用是“setFrameShape()”和“setFrameShadow()”。 (2认同)

Mic*_*ard 15

这是使用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)
Run Code Online (Sandbox Code Playgroud)

然后可以将其用作(例如):

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_()
Run Code Online (Sandbox Code Playgroud)

其结果如下:

Windows 10上的QHLine示例


小智 6

这是一个使用标准 PyQt5 的解决方案,我从 shoosh 的回答中得出:

from PyQt5 import QtWidgets

class QHSeperationLine(QtWidgets.QFrame):
  '''
  a horizontal seperation line\n
  '''
  def __init__(self):
    super().__init__()
    self.setMinimumWidth(1)
    self.setFixedHeight(20)
    self.setFrameShape(QtWidgets.QFrame.HLine)
    self.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
    return

class QVSeperationLine(QtWidgets.QFrame):
  '''
  a vertical seperation line\n
  '''
  def __init__(self):
    super().__init__()
    self.setFixedWidth(20)
    self.setMinimumHeight(1)
    self.setFrameShape(QtWidgets.QFrame.VLine)
    self.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
    return
Run Code Online (Sandbox Code Playgroud)

如果您想添加它(例如添加到网格中):

seperator_vertical = seperation_lines.QVSeperationLine()
seperator_horizontal = seperation_lines.QHSeperationLine()

grid = QtWidgets.QGridLayout()

grid.addWidget(your_widget_left_from_vertical_seperator, 0, 0, 1, 1,)
grid.addWidget(seperator_vertical, 0, 1, 1, 1)
grid.addWidget(your_widget_right_from_vertical_seperator, 0, 2, 1, 1,)
grid.addWidget(seperator_horizontal, 1, 0, 1, 2)
grid.addWidget(your_widget_below_horizontal_spacer, 2, 0, 1, 2)
Run Code Online (Sandbox Code Playgroud)

确保永远不要在分隔符上使用对齐方式,否则它可能会让您感到困惑,因为它们无法正确缩放。

只是为了展示这里的所有内容是如何将其添加到您的窗口:

import sys
if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    widget = QtWidgets.QWidget()
    widget.setLayout(grid)
    widget.show()
    sys.exit(app.exec())
Run Code Online (Sandbox Code Playgroud)