如何使Qqt dockwidgett的窗口一开始就是标签模式

实例15 停靠窗口 - PyQt4 精彩实例分析_Linux编程_Linux公社-Linux系统门户网站
你好,游客
PyQt4 精彩实例分析
实例15 停靠窗口
来源:Linux社区&
作者:chumpklutz
本实例实现停靠窗口的基本使用方法,实现的效果图如下所示。
本实例实现的停靠窗口的可实现状态已在各窗口中进行了描述,停靠窗口1只可在主窗口的左边和右边停靠,停靠窗口2只可在浮动和在右停靠两种状态间切换,并且不可移动,停靠窗口3可实现停靠窗口的各个状态。具体状态此处不再一一用图示的方式列出,读者可自行运行代码进行试验。
具体实现代码如下:
from&PyQt4.QtGui&import&*&&
from&PyQt4.QtCore&import&*&&
import&sys&&
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))&&
class&MainWidget(QMainWindow):&&
&&&&def&__init__(self,parent=None):&&
&&&&&&&&super(MainWidget,self).__init__(parent)&&
&&&&&&&&self.setWindowTitle(self.tr("依靠窗口"))&&
&&&&&&&&te=QTextEdit(self.tr("主窗口"))&&
&&&&&&&&te.setAlignment(Qt.AlignCenter)&&
&&&&&&&&self.setCentralWidget(te)&&
&&&&&&&&&&
&&&&&&&&dock1=QDockWidget(self.tr("停靠窗口1"),self)&&
&&&&&&&&dock1.setFeatures(QDockWidget.DockWidgetMovable)&&
&&&&&&&&dock1.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)&&
&&&&&&&&te1=QTextEdit(self.tr("窗口1,可在Main&Window的左部和右部停靠,不可浮动,不可关闭"))&&
&&&&&&&&dock1.setWidget(te1)&&
&&&&&&&&self.addDockWidget(Qt.RightDockWidgetArea,dock1)&&
&&&&&&&&&&
&&&&&&&&dock2=QDockWidget(self.tr("停靠窗口2"),self)&&
&&&&&&&&dock2.setFeatures(QDockWidget.DockWidgetFloatable|QDockWidget.DockWidgetClosable)&&
&&&&&&&&te2=QTextEdit(self.tr("窗口2,只可浮动"))&&
&&&&&&&&dock2.setWidget(te2)&&
&&&&&&&&self.addDockWidget(Qt.RightDockWidgetArea,dock2)&&
&&&&&&&&&&
&&&&&&&&dock3=QDockWidget(self.tr("停靠窗口3"),self)&&
&&&&&&&&dock3.setFeatures(QDockWidget.AllDockWidgetFeatures)&&
&&&&&&&&te3=QTextEdit(self.tr("窗口3,可在Main&Window任意位置停靠,可浮动,可关闭"))&&
&&&&&&&&dock3.setWidget(te3)&&
&&&&&&&&self.addDockWidget(Qt.BottomDockWidgetArea,dock3)&&
&&&&&&&&&&&&&&&&&&&
app=QApplication(sys.argv)&&
main=MainWidget()&&
main.show()&&
app.exec_()&&
第11行设置主窗口的标题栏文字。
第13-15行定义一个QTextEdit对象作为主窗口,并把此编辑框设为MainWindow的中央窗体。
第18-23行设置停靠窗口1。
第26-30行设置停靠窗口2。
第33-37行设置停靠窗口3。
设置停靠窗口的一般流程为:
1)创建一个QDockWidget对象的停靠窗体。
2)设置此停靠窗体的属性,通常调用setFeatures()及setAllowedAreas()两个方法。
3)新建一个要插入停靠窗体的控件,本实例中为QTextEdit,也可为其他控件,常用的一般为QListWidget和QTextEdit。
4)把控件插入停靠窗体,调用QDockWidget的setWidget()方法。
5)使用addDockWidget()方法在MainWindow中加入此停靠窗体。
本实例的3个停靠窗体都是按此流程实现的,此处需要重点介绍的是设置停靠窗体状态的方法setAllowedAreas()和setFeatures()。
其中setAllowedAreas()方法设置停靠窗体可停靠的区域,原型如下:
setAllowedAreas (self, Qt.DockWidgetAreas)
参数Qt.DockWidgetAreas指定了停靠窗体可停靠的区域,包括以下几种。
Qt.LeftDockWidgetArea:可在主窗口的左侧停靠。
Qt.RightDockWidgetArea:可在主窗口的右侧停靠。
Qt.TopDockWidgetArea:可在主窗口的顶端停靠。
Qt.BottomDockWidgetArea:可在主窗口的底部停靠。
Qt.AllDockWidgetArea:可在主窗口任意(以上四个)部位停靠。
Qt.NoDockWidgetArea:可停靠在插入处。
各区域设定可采用或(|)的方式进行设定,如本实例中的第8行。
setFeatures()方法设置停靠窗体的特性,原型如下:
setFeatures (self, DockWidgetFeatures)
参数QDockWidgetFeatures指定停靠窗体的特性,包括以下几种。
QDockWidget.DockWidgetClosable:停靠窗可关闭,右上角的关闭按钮。
QDockWidget.DockWidgetMovable:停靠窗可移动。
QDockWidget.DockWidgetFloatable:停靠窗可浮动。
QDockWidget.AllDockWidgetFeature:此参数表示拥有停靠窗的所有特性。
QDockWidget.NoDockWidgetFeature:不可移动,不可关闭,不可浮动。
此参数也可采用或(|)的方式对停靠窗进行特性的设定,如实例中的第27行所示。15
【内容导航】
相关资讯 & & &
& (10/16/:11)
& (06/24/:39)
& (06/24/:01)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
匿名 发表于 11下次自动登录
现在的位置:
& 综合 & 正文
qt可停靠控件和工具栏(Dock Widgets and Toolbars)
可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动。QMainWindow提供了四个可停靠控件的地方:上方,下方,左方,右方。Microsoft Visual Stadio和Qt Linguist程序使用大量的可停靠窗口实现更为复杂的用户界面。在Qt中,可停靠窗口是QDockWidget的一个实例。
每一个可停靠控件都有一个标题条。用户可以拖动标题栏把窗口从一个可停靠区域移动到另一个可停靠区域。拖动标题栏把窗口移动到不能停靠的区域,窗口就浮动为一个独立的窗口。自由浮动的窗口总是在主窗口的上面。用户点击标题栏上的关闭按钮可以关闭QDockWidget。调用QDockWidget::setFeatures()能够设置以上这些属性。
在Qt的早期版本中,工具条也是作为可停靠控件,可以放置在任何可停靠区域中。从Qt4开始,工具条有了自己的位置,不能再浮动了,如果需要一个可停靠的工具条,我们可以把它放到QDockWindow里面。用点线表示的四个角落可以属于任何一个相邻的可停靠区域。例如,调用QMainWindow::setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea)把左上角作为左侧的停靠区域。下面的将一个现有的控件(如QTreeWidget)放置到QDockWidget中,停靠再右边的停靠区域。QDockWidget *shapesDockWidget = new QDockWidget(tr("Shapes"));shapesDockWidget-&setWidget(treeWidget);shapesDockWidget-&setAllowedAreas(Qt::LeftDockWidgetArea
| Qt::RightDockWidgetArea);addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget); 函数setAllowAreas()确定控件可停靠的位置。在上面的代码允许用户把窗口拖动到左边或者右边的可停靠区域,这两个地方垂直控件足够显示一个树型控件。如果没有指定停靠区域,用户可以拖动控件到任何四个可停靠的区域。 下面的代码创建一个工具栏,包含一个QComboBox,QSpinBox和一些QToolButton,代码为QMainWindow子类的构造函数的一部分:QToolBar *fontToolBar = new QToolBar(tr("Font"));fontToolBar-&addWidget(familyComboBox);fontToolBar-&addWidget(sizeSpinBox);fontToolBar-&addAction(boldAction);fontToolBar-&addAction(italicAction);fontToolBar-&addAction(underlineAction);fontToolBar-&setAllowedAreas(Qt::TopToolBarArea
| Qt::BottomToolBarArea);addToolBar(fontToolBar); 如果我们需要在下一次运行程序时恢复所有可停靠控件和工具栏的位置,可以使用和保存QSplitter状态相似的代码: void MainWindow::writeSettings(){
QSettings settings("Software Inc.", "Icon Editor");
settings.beginGroup("mainWindow");
settings.setValue("size", size());
settings.setValue("state", saveState());
settings.endGroup();}void MainWindow::readSettings(){
QSettings settings("Software Inc.", "Icon Editor");
settings.beginGroup("mainWindow");
resize(settings.value("size").toSize());
restoreState(settings.value("state").toByteArray());
settings.endGroup();} QMainWindow提供了一个上下文菜单,列出了所有可停靠的窗口和工具栏。用户可以通过这个菜单关闭显示停靠窗口和工具栏。
本文来自CSDN博客,转载请标明出处:
&&&&推荐文章:
【上篇】【下篇】Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法 - 推酷
Qt中,当QDockWidget的父窗口是一个不可以拖动的QTabWidget的时候实现拖动的方法
之前在做有关QDockWidget的内容时候遇到了瓶颈,那就是窗口弹出来之后拖动不了,也不可以放大和缩小,若是弹出来之后设置成了window的flags,也不可以拖动,而且也不是需要的效果。
1.弹出来之后的dockwidget的titlebar右边需要有3个按钮分别来控制放大与恢复、弹出来与收进去和关闭按钮。考虑到Qt自带的dockwidget弹出来后实现不了这个,所以参考了网上的方法,需要自己从QWidget中派生一个类来实现自己的titlebar
2.因为dockwidget是嵌套在QTabWidget中的,而tabwidget本身是不可以拖动的,所以此dockwiget也不可以拖动(Qt中子窗口的拖动是和父窗口有关联的),加上需要实现自己的dockwidget样式,所以也从QDockWidget中派生一个类
首先实现自己的titlebar:
1 class myDockWidgetTitleBar:public QWidget
5 private:
//自己需要的类成员定义
QSize sizeHint() const { return minimumSizeHint(); }
QSize mimimumSizeHint() const;//在写自己的titlebar时,这2个函数必须要实现
10 protected:
void paintEvent(QPaintEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
15 private slots:
//自己定义的一些槽函数,比如我这里需要实现放大缩小、浮动和关闭
void MaxMinDockWidget();
void FloatDockWidget();
void CloseDockWidget();
21 public:
myDockWidgetTitleBar(QWidget *parent = 0);
~myDockWigetTitleBar();
这里需要注意的是:若dockwidget没有titlebar则直接setTitleBarWidget(QWidget());这样可以只有一个dockwidget的窗口而没有窗口上面的titlebar。(方法来源于网上,源地址找寻不到了,若是找到再加上原有链接)
下面写一下在实现titlebar时必须要实现的函数的实现:
1 QSize *myDockWidgetTitleBar::minimumSizeHint() const
myDockWidget*dock_widget = qobject_cast&myDockWidget *&(parentWidget());
Q_ASSERT(dock_widget != 0);
QSize result(50, 30);
if(dock_widget-&features & QDockWidget::DockWidgetVerticalTitleBar)
result.transpose();
paintEvent主要用来在titlebar上绘制图标和位置。不过我这里因为这些按钮其他地方也要用到,所以我将按钮都定义成了类成员,同时在构造函数中给出了按钮的类型。其他的slots函数可以根据需求定义就行。
实现自己的dockwidget:
1 class myDockWidget:public QDockWidget
5 private:
//一些类成员变量
int _cur_point_
int _margin_
QWidget *_default_title_
myDockWidgetTitleBar *_dock_widget_title_
12 protected:
void mouseMoveEvent(QMouseEvent *event);//因为要实现拖动,所以这个鼠标移动事件必须要实现
void mousePressEvent(QMouseEvent *event);//拖动的时候鼠标左键应该是一直按压着的,所以需要在这个里面进行判断
void mouseReleaseEvent(QMouseEvent *event);
void closeEvent(QCloseEvent *event);
18 public:
myDockWidget(QTabWidget *tab_widget, QWidget *parent = 0);
~myDockWidget();
需要注意的是这里的类定义中都用到了Q_OBJECT,若是在类中有信号和槽函数的定义,则必须要写此,具体的原因请参考Qt帮助手册。
上面的类中还需要定义一个用来判断鼠标左键是否一直按压着的bool变量和鼠标之前点击的位置信息:
1 private:
bool _left_mose_
Qpoint _last_point_pos, _length_
鼠标按压事件中:
1 void myDockWidget::mousePressEvent(QMouseEvent *event)
if(event-&button == Qt::LeftButton)
_left_mouse_press =
_last_point_pos = event-&globalPos();
_cur_point_pos = CountFlag(event-&pos(), CountColumn(event-&pos()));
event-&ignore();
鼠标释放事件中:
1 void myDockWidget::mouseReleaseEvent(QMouseEvent *event)
if(_left_mouse_press)
_left_mouse_press = false;
QApplication::restoreOverrideCursor();
event-&ignore();
重点是这里的鼠标移动事件,这里处理的方法参考了
,并且这里里面有很详细的描述:有拖动窗口也有当鼠标放到四周显示不同形状进行放大缩小。这里将一个窗口划分成3*3的板块的方法还是不错的。
但是这里有一点不好的就是,每次拖动的时候都会重绘,若是窗口里面的内容比较复杂,当鼠标移动过快的时候便会出现窗口在某一个位置停下来了。这里还需要进一步的改进。
(移动窗口本身也有很多方法,但是考虑到要支持不同的平台,可能不能够只用到windows下的函数,所以选择了上面的方法,若只有windows平台,可以考虑下面的方法:
这些都是我当时查找到的一些方法,其实网上的方法大多也都是类似的,当然如果能够一个一个的看demo中的例子,就会发现其实Qt的源代码中也有类似的操作,网上的方法和Qt例子中的都大同小异)
当然Qt中也有获取当前屏幕大小的函数,这个可用来处理放大和缩小的时候看要到什么大小:
1 QRect desktop_rect = QApplication::desktop()-&availableGeometry();
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
没有分页内容
图片无法显示
视频无法显示
与原文不一致如何使QDockWidget的窗口一开始就是标签模式_百度知道
如何使QDockWidget的窗口一开始就是标签模式
我有更好的答案
加上下面的代码 widget1-& widget1-&gt如果你想首先选择第一个show();raise()
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 qdockwidget 自动隐藏 的文章

 

随机推荐