PYQT5
pyqt5下,dialog用exec_()方法,widget用show()方法;
1.QDockWidget
QDockWidget是一个可以停靠在QMainWindow内的窗口控件,它可以保持浮动状态或在指定位置作为子窗口附加到主窗口中。其常用方法有:
setWidget(),用于设置在DockWidget内显示的QWidget及其子类对象。
setFloating(),设置DockWidget是否可以浮动,参数为True或False。
setAllowedArea(),设置可以停靠的区域,可用参数为Qt.DockWidgetAreas{LeftDockWidgetArea, RightDockWidgetArea, TopDockWidgetArea, BottomDockWidgetArea, AllDockWidgetAreas, NoDockWidgetArea}。
setFeatures(),设置停靠窗口的功能属性(有些属性决定了显示哪些按钮),可用参数为QDockWidget.DockWidgetFeatures{DockWidgetClosable, DockWidgetMovable, DockWidgetFloatable, DockWidgetVerticalTitleBar, AllDockWidgetFeatures, NoDockWidgetFeatures}。
其常用信号有:
topLevelChanged(bool topLevel):当浮动状态变化时发生,参数为True时为浮动状态。
void visibilityChanged(bool visible):当显示状态变化时发生(一般是在以Tab方式显示时使用),参数为True时可见。
QMainWindow类中包含了有关DockWidget的一些函数方法,主要有:
addDockWidget(Qt.DockWidgetArea area, QDockWidget dockwidget),将DockWidget添加到主窗口,第一个参数为停靠位置,第二个参数为要添加的DockWidget。
setDockOptions(),设置停靠属性,参数类型为QMainWindow.DockOptions { AnimatedDocks, AllowNestedDocks, AllowTabbedDocks, ForceTabbedDocks, VerticalTabs, GroupedDragging }
setTabPosition(Qt.DockWidgetAreas areas, QTabWidget.TabPosition position),设置停靠和标题位置,第一个参数为停靠位置,第二个参数为标题位置,取值范围QtabWidget.TabPosition { North, South, West, East }。
tabifyDockWidget(QDockWidget first, QDockWidget second),以Tab方式显示DockWidget,其中第二个窗体排在第一个之后。
setTabShape(QTabWidget.TabShape shape),设置Tab标签样式,取值范围QTabWidget.TabShape { Rounded, Triangular }。
2.右键菜单
1 | item_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) |
将菜单在当前位置显示
1 | 方法一: |
3.自定义list item
https://stackoverflow.com/questions/25187444/pyqt-qlistwidget-custom-items
4.Margin
(left, top, right, bottom)
5.信号额外参数传递
https://blog.csdn.net/fengyu09/article/details/39498777
6.拖放技术
使用拖放技术可实现在不同控件或应用之间的数据交换。使用该技术的典型示例是在Windows资源管理器中移动文件。要将文件移动到另一个目录,只需用鼠标左键单击文件图标差按住不放,将文件拖动到目标目录图标,然后释放鼠标按钮。如果要复制文件,而不是移动文件,则还要按住键。
1.拖动
(1) 在mousePressEvent()
中,记录鼠标按下时的位置;
(2) 在mouseMoveEvent ()
中,计算鼠标移动的距离,可用来防止无意的拖动。QApplication的下列静态方法可用来控制延迟量:
1 | setstartDragDistance (Distance) - 拖动开始的最小移动量; |
(3) 鼠标移动超过最小移动值或按压鼠标超过最小毫秒数,拖动操作开始。此时,创建一个QDrag对象,调用exce()方法进行相关操作。QDrag有以下方法:
1 | exec( ) - 开始拖放操作,返回一个代表放置操作的枚举值。有两个格式: |
QDrag有两个信号:actionChanged (Qt.DropAction dact)
- 当拖放的行为被该变时,发射该信号;targetchanged (QWidget obj)
- 当目标控件被改变时,将会发射该信号;
2.QMineData类
拖放过过程中的MIME类型的数据传递通过将QMineData对象作为参数调用QDrag的setMimeData()函数实现。
创建QMimeData方法:
data=QtCore.QMimeData()
QMimeData类支持以下方法(详见http://doc.qt.io/qt-5/qmimedata.html):
1 | setText(text) - 设置文本数据(MIME型文本/文本格式): |
如果要实现特殊类型数据的拖放,需要创建一个QMimeData子类,并重载retrieveData( ) 和 formats ( )方法。详细内容,请参考Qt文档。
3.放置操作
在处理拖放对象之前,必须告诉系统该组件可以处理这些事件。 为此,要在组件的构造函数中,调用继承自QWidget类的setAcceptDrops方法,参数值为True:self.setAcceptDrops(True)
拖放对象的过程执行如下:
在控件的dragEnterEvent()方法中,检查拖动的MIME类型数据。如果该控件能处理此类型数据,则调用事件对象的acceptProposedAction( )方法。如果要变更操作,则将新事件传递给事件对象的setDropAction( )方法,然后调用accept( )方法,而不是调用acceptProposedAction( )方法。
如果要限制控件的特定区域才能放置操作,必须在dragMoveEvent( )方法中处理。即当拖放进入到特定的区域,调用accept( QRect rect)方法,参数rect为特定区域的QRect对象。
在控件的dropEvent()方法中,完成相关操作。
QWidget类的下列方法可以处理在拖放过程中发生的事件:
dragEnterEvent (self,event) - 当拖动进入到控件区域时调用。通过event参数, 可取得QDragEnterEvent实例;
dragLeaveEvent(self,event) - 当拖动离开控件区域时调用。通过event参数, 可取得QDragLeaveEvent实例;
dragMoveEvent (self, event) -当拖动在控件区域移动时调用。通过event参数, 可取得QDragMoveEvent实例;
dropEvent (self, event) - 当拖动在控件区域放开时调用。通过event参数, 可取得QDropEvent实例;
QDragLeaveEvent类继承自QEvent类,不附带任何其他信息。因为在该类中只要知道拖动的对象已经离开组件区域就够了。
相关类的继承顺序为:
QEvent - QDropEvent - QDragMoveEvent - QDragEnterEvent
QDragEnterEvent类中没有增加新方法。
QDropEvent类有下列方法:
1 | mimeData( ) - 返回含有所传输数据和MIME类型信息的QMimeData类的实例; |
QDragMoveEvent类的方法有:
1 | accept (QRect rect) - 表明允许后续的移动操作。 rect用来指定可接受拖放操作的区域; |
PyQt中的有些控件,如单行文本控件,已有拖放功能。因此,在自己实现拖放功能之前,请仔细阅读相关控件的文档。
7.List和Tree之间的拖拽事件
listwidget中自定义widget的drag&drop
pyqt model/view drag&drop example
8. show和exec的区别
Pyqt中 QDialog show和exec的区别
QDialog的显示有两个函数show()和exec()。他们的区别在参考文档上的解释如下:
show():
显示一个非模式对话框。控制权即刻返回给调用函数。
弹出窗口是否模式对话框,取决于modal属性的值。
原文:Shows the dialog as a modeless dialog. Control returns immediately to the calling code.
The dialog will be modal or modeless according to the value of the modal property.
exec():
显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。函数返回一个DialogCode结果。
在对话框弹出期间,用户不可以切换同程序下的其它窗口,直到该对话框被关闭。
原文:Shows the dialog as a modal dialog, blocking until the user closes it. The function returns a DialogCode result.
Users cannot interact with any other window in the same application until they close the dialog.
模式与非模式
模式对话框,就是在弹出窗口的时候,整个程序就被锁定了,处于等待状态,直到对话框被关闭。这时往往是需要对话框的返回值进行下面的操作。如:确认窗口(选择“是”或“否”)。
非模式对话框,在调用弹出窗口之后,调用即刻返回,继续下面的操作。这里只是一个调用指令的发出,不等待也不做任何处理。如:查找框。
简单的理解:
首先这两个方法返回值不同。exec()有返回值,show()没有返回值。
其次这两个方法的作用也不同。调用show()的作用仅仅是将widget及其上的内容都显示出来,控制权即刻返回给调用函数。而调用exec()后,调用线程将会被阻塞,锁住程序直到用户关闭该对话框,期间用户不可以切换同程序下的其它窗口直到Dialog关闭。
9.只接受数字&密文
1 | self.kernel1_size_text = QtWidgets.QLineEdit() |
10.自定义信号和槽
1 | _signal = QtCore.pyqtSignal(str) # 定义信号,定义参数为str类型 |