- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有类似这样的 JSON 数据
{"books":{
"web":{
"front-end":{
"html":["the missing manual", "core html5 canvas"],
"css":["css pocket reference", "css in depth"],
"js":["you don't know js", "eloquent javascript"]
},
"back-end":{
"php":["modern php", "php web services"],
"python":["dive into python", "python for everybody",
"Think Python", "Effective Python", "Fluent Python"]
}
},
"database":{
"sql":{
"mysql":["mysql in a nutshell", "mysql cookbook"],
"postgresql":["postgresql up and running", "practical postgresql"]
},
"nosql":{
"mongodb":["mongodb in action", "scaling mongodb"],
"cassandra":["practical cassandra", "mastering cassandra"]
}}}}
现在我想使用 QAbstractListModel
和 QToolBar
作为面包屑导航 (QAction) 在 QListView
中填充这些数据。 QListView
将随着用户更新触发键。那么我该如何实现呢?
(来源:gifyu.com)
最佳答案
第一件事是将 json 转换为模型,在本例中使用 QStandardItemModel
。然后我们在 QListView
中使用该模型,使用 setRootIndex()
来指示将显示的项目,另一方面将 QActions
添加到使用父树的 QToolBar
。
from PyQt5 import QtCore, QtGui, QtWidgets
data = {"books":{
"web":{
"front-end":{
"html":["the missing manual", "core html5 canvas"],
"css":["css pocket reference", "css in depth"],
"js":["you don't know js", "eloquent javascript"]
},
"back-end":{
"php":["modern php", "php web services"],
"python":["dive into python", "python for everybody",
"Think Python", "Effective Python", "Fluent Python"]
}
},
"database":{
"sql":{
"mysql":["mysql in a nutshell", "mysql cookbook"],
"postgresql":["postgresql up and running", "practical postgresql"]
},
"nosql":{
"mongodb":["mongodb in action", "scaling mongodb"],
"cassandra":["practical cassandra", "mastering cassandra"]
}}}}
def dict_to_model(item, d):
if isinstance(d, dict):
for k, v in d.items():
it = QtGui.QStandardItem(k)
item.appendRow(it)
dict_to_model(it, v)
elif isinstance(d, list):
for v in d:
dict_to_model(item, v)
else:
item.appendRow(QtGui.QStandardItem(str(d)))
class Navigation(QtCore.QObject):
clicked = QtCore.pyqtSignal(QtCore.QModelIndex)
def __init__(self, json_data, parent=None):
super(Navigation, self).__init__(parent)
self.toolbar = QtWidgets.QToolBar()
self.toolbar.actionTriggered.connect(self.on_actionTriggered)
self.model = QtGui.QStandardItemModel(self)
dict_to_model(self.model.invisibleRootItem(), json_data)
it = self.model.item(0, 0)
ix = self.model.indexFromItem(it)
root_action = self.toolbar.addAction(it.text())
root_action.setData(QtCore.QPersistentModelIndex(ix))
self.listview = QtWidgets.QListView()
self.listview.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.listview.clicked.connect(self.on_clicked)
self.listview.setModel(self.model)
self.listview.setRootIndex(ix)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_clicked(self, index):
if not self.model.hasChildren(index):
self.clicked.emit(index)
return
action = self.toolbar.addAction(index.data())
action.setData(QtCore.QPersistentModelIndex(index))
self.listview.setRootIndex(index)
@QtCore.pyqtSlot(QtWidgets.QAction)
def on_actionTriggered(self, action):
ix = action.data()
model = ix.model()
self.listview.setRootIndex(QtCore.QModelIndex(ix))
self.toolbar.clear()
ixs = []
while ix.isValid():
ixs.append(ix)
ix = ix.parent()
for ix in reversed(ixs):
action = self.toolbar.addAction(ix.data())
action.setData(ix)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
navigation = Navigation(data, self)
navigation.clicked.connect(self.on_clicked)
tree_view = QtWidgets.QTreeView()
tree_view.setModel(navigation.model)
navigation.model.setHorizontalHeaderLabels(["Tree Example"])
tree_view.expandAll()
self.addToolBar(navigation.toolbar)
widget = QtWidgets.QWidget()
self.setCentralWidget(widget)
lay = QtWidgets.QHBoxLayout(widget)
lay.addWidget(navigation.listview)
lay.addWidget(tree_view)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_clicked(self, index):
print(index.data())
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
关于python - 使用 QToolBar 和 QListView 进行面包屑导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53022651/
在 OS X (Yosemite) 上使用 Qt 5.4,我有一个带有图标的 QAction。我希望图标显示在我添加操作的 QToolbar 中。这很好用。但是,我不希望图标显示在我添加操作的 QMe
我要的是:http://puu.sh/3oUjh.jpg 我有什么:http://puu.sh/3oUnI.png 工具栏是在mainwindow.ui中制作的,我试过ui->_toolbar->se
您如何建议在 QToolbar 上添加标签?因为它只接受 Action 或类似的东西。 谢谢 最佳答案 正如 abresas 所写,工具栏可以填充 QAction . 与 QAction 一起传递的
我在 QToolbar (b) 中有一个 QToolBar (a),然后在 (a) 中有几个 QWidgets (x) )看起来有点像这样: |xxxxxxxxxxxxxxxx|b----------
在我的项目中,我有一个具有默认大小和大小策略的 QToolBar。我想将工具栏的高度增加到 36px。 到目前为止我已经尝试过: 为工具栏设置样式表属性:height: 36px; 将工具栏对象的大小
开始于:我正在使用适用于 C++ 的 QT Creator 5.4.1。 我需要覆盖 QToolbar 小部件上称为扩展或扩展按钮的功能/特性。我已经通读了 QT 文档,似乎没有一个函数可以调用/覆盖
我正在向小部件添加工具栏,并动态隐藏操作(它们也用于上下文菜单)。我遇到一些对齐/大小问题。在下图中,测试 1 是“正确的”,我希望其他两个只有“C”按钮,右对齐(与测试 3 一样,但没有额外的左侧空
我正在尝试在 Qt 设计器中使用以下样式表 background : rgb(30, 30, 30) 设置 QToolBar 的背景颜色。出于某种原因,背景颜色仅应用于操作的背景,如图像中所示。如何更
在 Qt 中,当移动 QToolBar 时,可以使用 QToolBar::topLevelChanged(bool) 信号来了解 QToolBar 是 float 的还是停靠的。 当QToolBar停
当我在 QToolBar 上调用 setIconSize(QSize(16, 16)) 时,它会从各个方向(主要是底部)留下边距。 setContextMargins(0, 0, 0, 0) 没有帮助
我找了好久都没有找到解决这个问题的办法:在 QtCreator 中,我有一个带有 2 个 QToolBar 的主窗口,一个是垂直的(Qt::LeftToolBarArea),一个是水平的(Qt::Bo
有谁知道如何在 Qt(实际上是 PyQt)中制作一个好的搜索框。它应该位于工具栏 (QToolbar) 中,看起来与普通的 QLineEdit 略有不同(圆角和图标作为前缀)。它应该与其余控件之间的空
我使用 addAction() 将 QActions 添加到 QToolBar。 我希望工具栏按钮工具提示显示快捷方式。例如复制 (Ctrl+C)。当然,我可以静态设置 action->setTool
我目前正在使用 Qt 构建我的应用程序界面。但是有一个问题出现了...我有一个 QToolbar,我用 QToolbar->addWidget 方法添加了一个 QToolButton。问题是我想稍后删
我正在使用 PySide。我有一个带有垂直 QToolBar myToolBar 的 QMainWindow。我使用 myToolBar.toolButtonStyle = Qt.ToolButton
让我们考虑以下屏幕截图: 可以看到顶部工具栏显示2行;然而要做到这一点,需要点击右上角的>>(红色圆圈)并保持悬停在工具栏区域,这可能会有点烦人。 有没有办法让工具栏的两行始终显示? 最佳答案 解决办
我有一个 QToolbar,我已经应用了样式: sMainWindowStyle += "QToolBar::handle { image: url(:/icons/toolbar_handle.pn
我想把 QLabel 放到 QToolBar 中。我这样做了,但是 QLabel 改变了 QToolBar 的大小,并且没有填充它,请参见下面的第一张图片。我需要的是让 QLabel 填充 QTool
我在让我的工具栏显示边框或什至能够变得可移动时遇到问题。我无法解决问题,我是 Qt 的新手,所以非常感谢任何帮助。 我的代码: QWidget *view = new QTextEdit(this);
我正在开发一个 Qt 项目,我需要在运行时获取工具栏位置。有什么方法可以获取 QToolbar 在 QMainWindow 中的当前位置? 谢谢。 编辑: 感谢您的回答,我已经完成了 75% 的工作。
我是一名优秀的程序员,十分优秀!