- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从选项卡小部件中拖动一个选项卡并拆分查看区域(- 就像 eclipse 然后将选项卡标题拖动到编辑区域中一样 - 类似于 PyCharm 中选项卡上的“垂直拆分”功能) .
我尝试使用拖放但无法让选项卡主区域(例如文本区域)注册来自 QTabBar 的拖动。然后我尝试只跟随鼠标移动并更进一步,但是拆分器代码不是很有效,而且它是非常难看的代码。
注意我没有使用可停靠小部件,因为此代码将用于应用程序的中央小部件。我更喜欢使用拖放来执行此操作 - 谁有任何想法?
from PyQt4.QtGui import QWidget, QDrag, QTabBar, QTabWidget, QPainter, QPalette,\
QBrush, QColor, QPen, QVBoxLayout, QHBoxLayout, QTextEdit, QCheckBox
from PyQt4.QtCore import QByteArray, QMimeData, QPoint
from PyQt4 import QtCore, QtGui
class CentralTabWidget(QTabWidget):
def __init__(self, parent=None):
QTabWidget.__init__(self, parent)
self.parent = parent
tabBar = CentralTabBar(self)
self.setTabBar(tabBar)
self.addWidgets()
def addWidgets(self):
tab1 = QWidget()
self.addTab(tab1, "Tab1")
textArea = QTextEdit()
textArea.setText("Text area 1")
vBox = QVBoxLayout()
vBox.addWidget(textArea)
tab1.setLayout(vBox)
tab2 = QWidget()
self.addTab(tab2, "Tab2")
textArea2 = QTextEdit()
textArea2.setText("Text area 2")
vBox2 = QVBoxLayout()
vBox2.addWidget(textArea2)
tab2.setLayout(vBox2)
self.setAcceptDrops(True)
self.verticalLineOverlay = Overlay(parent = self)
self.verticalLineOverlay.hide()
def dragEnterEvent(self, event):
mimeData = event.mimeData()
event.accept()
def dragMoveEvent(self, event):
print(">>dragMoveEvent()")
def dropEvent(self, event):
mimeData = event.mimeData()
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
def resizeEvent(self, event):
self.verticalLineOverlay.resize(event.size())
event.accept()
class CentralTabBar(QTabBar):
def __init__(self, parent=None):
QTabBar.__init__(self, parent)
self.parent = parent
self.__drag_start_pos = QPoint()
self.setAcceptDrops(True)
def mousePressEvent(self, event):
self.__mousePressPos = None
self.__mouseMovePos = None
if event.button() == QtCore.Qt.LeftButton:
self.__mousePressPos = event.globalPos()
self.__mouseMovePos = event.globalPos()
if self.parent.parent.dndCheckBox.isChecked():
self.startDrag()
super(CentralTabBar, self).mousePressEvent(event)
def mouseReleaseEvent(self, event):
self.parent.verticalLineOverlay.setVisible(False)
currPos = self.mapToGlobal(self.pos())
ax, ay, aw, ah = self.geometry().getRect()
if currPos.x() > ax + aw/4:
self.parent.parent.createSplitter()
super(CentralTabBar, self).mouseReleaseEvent(event)
def mouseMoveEvent(self, event):
if event.buttons() == QtCore.Qt.LeftButton:
currPos = self.mapToGlobal(self.pos())
globalPos = event.globalPos()
diff = globalPos - self.__mouseMovePos
newPos = self.mapFromGlobal(currPos + diff)
xp1, yp1, xp2, yp2 = self.geometry().getCoords()
ax, ay, aw, ah = self.geometry().getRect()
parentx, parenty, parentw, parenth = self.parent.geometry().getCoords()
if parenth > 10:
if (newPos.y() > yp2) and (newPos.y() < (parenth)):
self.parent.verticalLineOverlay.setVisible(True)
super(CentralTabBar, self).mouseMoveEvent(event)
def startDrag(self):
data = QByteArray()
mimeData = QMimeData()
mimeData.setData("application/x-icon-and-text", data)
print("Using DnD")
drag = QDrag(self)
drag.setMimeData(mimeData)
drag.exec_()
def dragEnterEvent(self, event):
event.accept()
def dragMoveEvent(self, event):
print("--dragMoveEvent()")
def dropEvent(self, event):
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()
class Overlay(QWidget):
def __init__(self, parent=None):
super(Overlay, self).__init__(parent)
print("--__init__() parent type:{0}".format(type(parent)))
self.parent = parent
palette = QPalette(self.palette())
palette.setColor(palette.Background, QtCore.Qt.transparent)
self.setPalette(palette)
def paintEvent(self, event):
self.painter = QPainter()
self.painter.setPen(QPen(QtCore.Qt.NoPen))
self.painter.begin(self)
self.painter.setRenderHint(QPainter.Antialiasing)
self.painter.fillRect(self.parent.currentWidget().geometry(), QBrush(QColor(255, 255, 255, 10)))
parentx, parenty, parentw, parenth = self.parent.geometry().getCoords()
self.painter.drawRect( parentx, parenty, (parentw/2)-10, parenth)
self.painter.drawRect( (parentw/2)+10, parenty, parentw, parenth)
self.painter.setPen(QPen(QtCore.Qt.NoPen))
def setUpPainter(self):
self.painter = QPainter()
self.painter.setPen(QPen(QtCore.Qt.NoPen))
self.painter.begin(self)
self.painter.setRenderHint(QPainter.Antialiasing)
self.painter.fillRect(self.parent.currentWidget().geometry(), QBrush(QColor(255, 255, 255, 10)))
parentx, parenty, parentw, parenth = self.parent.geometry().getCoords()
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.layout = QHBoxLayout()
self.dndCheckBox = QCheckBox("Use DnD")
self.dndCheckBox.setChecked(True)
self.ctw = CentralTabWidget(self)
self.layout.addWidget(self.ctw)
self.layout.addWidget(self.dndCheckBox)
self.setLayout(self.layout)
def createSplitter(self):
#not sure why widgets are not redrawn inside the splitter
splitter1 = QtGui.QSplitter(QtCore.Qt.Horizontal)
self.removeWidgets(self.layout)
splitter1.addWidget(self.ctw)
self.layout.addWidget(splitter1)
self.layout.addWidget(self.dndCheckBox)
def removeWidgets(self, layout):
for cnt in reversed(range(layout.count())):
widget = layout.takeAt(cnt).widget()
if widget is not None:
widget.deleteLater()
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.resize(350, 300)
window.show()
sys.exit(app.exec_())
我尝试在 QMainMaindow 中使用 QMainWindow:
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import QMainWindow, QTextEdit, QDockWidget
_DOCK_OPTS = QtGui.QMainWindow.AllowNestedDocks
_DOCK_OPTS |= QtGui.QMainWindow.AllowTabbedDocks
class Window(QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
secondQMainWindow = QMainWindow()
self.central = secondQMainWindow
self.setDockOptions(_DOCK_OPTS)
dw1 = QDockWidget("One")
textArea = QTextEdit()
textArea.setText("Text area 1")
dw1.setWidget(textArea)
dw2 = QDockWidget("Two")
textArea2 = QTextEdit()
textArea2.setText("Text area 2")
dw2.setWidget(textArea2)
self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw1)
self.addDockWidget(QtCore.Qt.RightDockWidgetArea, dw2)
self.tabifyDockWidget(dw1, dw2)
dw3 = QDockWidget("Three")
textArea3 = QTextEdit()
textArea3.setText("Text area 3")
dw3.setWidget(textArea3)
self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dw3)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
app.exec_()
但我认为我没有正确地将小部件添加到父与子中央小部件。
最佳答案
这是我过去用过的一个技巧来完成您正在寻找的事情。如果您想对参数进行大量控制,它可能会非常有限,但它可以完成工作。
QMainWindow
作为 QMainWindow
的 centralWidget
。QMainWindow
设置任何 centralWidget
。设置标志:QMainWindow.AllowNestedDocks
和 QMainWindow.AllowTabbedDocks
通过添加 QDockWidgets
添加标签。这些将被自动威胁为 QTabWidgets
。
QMainWindow.tabifyDockWidget(firstWidget,secondWidget)
以编程方式堆叠小部件(它可以多次用于超过 2 个小部件)示例:
window=QtGui.QMainWindow()
window.centralContent=QtGui.QMainWindow()
window.setCentralWidget(window.centralContent)
window.centralContent.firstTabWidget=QtGui.QWidget()
window.centralContent.firstTabDock=QtGui.QDockWidget("first")
window.centralContent.firstTabDock.setWidget(window.centralContent.firstTabWidget)
window.centralContent.addDockWidget(window.centralContent.firstTabDock)
window.centralContent.secondTabWidget=QtGui.QWidget()
window.centralContent.secondTabDock=QtGui.QDockWidget("second")
window.centralContent.secondTabDock.setWidget(window.centralContent.secondTabWidget)
window.centralContent.addDockWidget(window.centralContent.secondTabDock)
window.centralContent.tabifyDockWidget( window.centralContent.firstTabDock, window.centralContent.secondTabDock)
关于drag-and-drop - 从 QTabWidget 拖放选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31893471/
在 Android 的 API > 19 中是否有任何方法可以获取可移动 SD 卡的路径? 与外部 SD 卡一样,我们有 Environment.getExternalStorageDirectory
一些 Android 设备有 microSD(或其他存储卡)插槽,通常安装为 /storage/sdcard1 据我所知,自 Android 4.4 起 Google 限制了对此内存的访问,并在 An
我使用 Java Card 2.1.2 SDK 和 GPShell 作为与设备通信的方式在 Java Card 上构建一个项目。我从 GpShell 测试了 helloworld 示例,并成功发送了
我开发了一个应用程序,它有一个来电接收器,它适用于所有手机。一位用户有一部双 SIM 卡安卓手机。该应用程序适用于第一张 SIM 卡。但是当有人调用他的第二张 SIM 卡时,我们的应用程序不会被调用。
我有一个带预览的文件输入。 这是笔 Codepen 我想强制高度,我无法理解我该怎么做。我想将此组件的高度固定为 300px(示例),我还需要保持加载图像的正确纵横比,用灰色背景填充空白。现在我保持宽
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我正在使用此代码访问 SD card : import os from os.path import join from jnius import autoclass #from android.pe
我正在为数据记录设备编写固件。它以 20 Hz 的频率从传感器读取数据并将数据写入 SD 卡。但是,向SD卡写入数据的时间并不一致(大约200-300 ms)。因此,一种解决方案是以一致的速率将数据写
我正在使用以下代码将视频放到网站上,但是在垂直方向上,手机屏幕上只能看到视频的左半部分 我不是网络开发人员。有人可以告诉我确切的内容吗,如何使其正确放置在手机屏幕上? 是在youtube iframe
我正在使用 Vuetify 1.5 和 Vuetify 网格系统来设置我的布局。现在我有一个组件 HelloWorld我将其导入到我的 Parent 中成分。我已经在我的 HelloWorld 中设置
我使用 python 制作了一个简单的二十一点游戏。我制作了游戏的其余部分,但我正在努力放入 ASCII 卡,所以这只是代码的一小部分。我尝试将 * len(phand) 放在附加行的末尾。虽然这确实
我正在使用玩家卡设置 Twitter 卡。它可以在预览工具中运行,但文档说它需要在“twitter.com 现代桌面浏览器? native iOs 和 Android Twitter 应用程序?mob
任何旧的 GSM 兼容 SIM 卡(3G USIM 的奖励)。 我想我需要一些硬件?谁能为业余爱好者推荐一些便宜的东西,以及一些更专业的东西? 我认为会有一个带有硬件的 API 的完整文档,所以也许这
我使用 python 制作了一个简单的二十一点游戏。我制作了游戏的其余部分,但我正在努力放入 ASCII 卡,所以这只是代码的一小部分。我尝试将 * len(phand) 放在附加行的末尾。虽然这确实
我记得前一段时间读到有 cpu 卡供系统添加额外的处理能力来进行大规模并行化。任何人都有这方面的经验和任何资源来研究项目的硬件和软件方面吗?这项技术是否不如传统集群?它更注重功率吗? 最佳答案 有两个
我检查外部存储是否已安装并且可用于读/写,然后从中读取。我使用的是确切的官方 Android 示例代码 ( from here )。 它说外部存储未安装。 getExternalFilesDir(nu
在 Android 2.1 及更低版本中,Android 应用程序可以请求下载到 SD 卡上吗?另外我想知道应用程序是否可以请求一些包含视频的文件夹下载到 SD 卡上?以及如何做到这一点? 提前致谢。
我们编写了一个 Windows 设备驱动程序来访问我们的自定义 PCI 卡。驱动程序使用 CreateFile 获取卡的句柄。 我们最近在一次安装中遇到了问题,卡似乎停止工作了。我们尝试更换卡(更换似
有些新设备(例如 Samsung Galaxy)带有两个 SD 卡。我想知道是否有任何方法可以确定设备是否有两张 SD 卡或一张 SD 卡。谢谢 最佳答案 我认为唯一的方法是使用 检查可用根的列表 F
我正在尝试将文件读/写到 SD 卡。我已经尝试在我的真实手机和 Eclipse 中的模拟器上执行此操作。在这两种设备上,对/mnt/sdcard/或/sdcard 的权限仅为“d--------”,我
我是一名优秀的程序员,十分优秀!