我用Qt Creator用c ++编写了一个Qt桌面应用程序.
我在主窗口中声明了一个treeView和一个兼容的模型.
现在,我想为树项目提供一个右键单击菜单.不是针对所有项目,而是针对其中的一部分,例如:对于具有偶数索引的树元素.
我尝试使用以下代码添加一个简单的上下文菜单:
在.h文件中:
QStandardItemModel* model;
QMenu* contextMenu;
QAction* uninstallAction;
private slots:
void uninstallAppletClickedSlot();
Run Code Online (Sandbox Code Playgroud)
并在.cpp文件中:
在构造函数中:
ui->treeView->setModel(model);
contextMenu = new QMenu(ui->treeView);
ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu);
uninstallAction = new QAction("Uninstall TA",contextMenu);
ui->treeView->addAction(uninstallAction);
connect(uninstallAction, SIGNAL(triggered()), this, SLOT(uninstallAppletClickedSlot()));
Run Code Online (Sandbox Code Playgroud)
和一个插槽:
void MainWindow::uninstallAppletClickedSlot()
{
}
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个带有想要动作的上下文菜单,但你知道我怎么能只为QStandardItem带有偶数索引的s 添加这个动作?
顺便说一句,我是通过以下方式向treeView添加项目:
void MainWindow::AddItem(QString name)
{
QStandardItem *parentItem = model->invisibleRootItem();
QStandardItem *app = new QStandardItem(name);
parentItem->appendRow(app);
}
Run Code Online (Sandbox Code Playgroud)
我google了很多,但一无所获:(
提前致谢!
我刚刚从wxPython切换到PyQT,我在QTreeview上遇到了一些麻烦.我有一个QTreeview,它将显示分类为可扩展的部分的数据,但是这个TreeView中的数据不应该是可编辑的,但我需要能够让用户选择数据(双击将执行另一个方法).我不确定如何使它只读,但也可以选择.我使用QStandardItemModel和QStandardItem来保存数据.
任何帮助将非常感激.
我有一个QStandardItemModel,我在q QTreeView中显示.工作良好.
为了突出显示相关的行,我想强调其中的一些:因此我有一个QStringList,其中包含要突出显示的QStandItem*的名称.
QStringList namesToBeHighlighted = getNames();
QModelIndex in = myModel->index(0, 0);
if ( in.isValid() ) {
for (int curIndex = 0; curIndex < myModel->rowCount(in); ++curIndex) {
QModelIndex si = myModel->index(curIndex, 0, in);
QStandardItem *curItem = myModel->itemFromIndex(si);
if (curItem) {
QString curItemName = curItem->text();
if ( namesToBeHighlighted.contains(curItem->text()) ) {
curItem->setFont(highlightFont);
}
else curItem->setFont(unHighlightFont);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的模型有以下结构:
Level_1
+ - > Level_11
+ - > Level_12
+ - > Level_13
Level_2
+ - > Level_21
+ - > Level_22
+ …
我不知道我的qt代码是否做错了什么。我只需要在itemChanged每次项目数据更改时发出该信号。我使用以下代码来制作模型:
QStandardItemModel* model = new QStandardItemModel;
QStandardItem *parentItem = model->invisibleRootItem();
QList<QStandardItem*> itemList1;
QList<QStandardItem*> itemList2;
QList<QStandardItem*> itemList3;
QStandardItem* item1;
QStandardItem* item2;
QStandardItem* item3;
for (int i = 0; i < 3; ++i)
{
item1 = new QStandardItem;
item1->setText("item1-" + QString::number(i));
for (int i = 0; i < 3; ++i)
{
item2 = new QStandardItem;
item2->setText("item2-" + QString::number(i));
for (int i = 0; i < 3; ++i)
{
item3 = new QStandardItem;
item3->setText("item3-" + QString::number(i));
itemList3 << item3;
}
item2->appendRows(itemList3); …Run Code Online (Sandbox Code Playgroud) 我有QStandardItemModel一个单列(代表一个列表)。列表中的每个项目都有一个唯一的整数ID,存储为QStandardItem的数据(QStandardItem::setData我猜默认情况下是通过它存储的Qt::UserRole+1)。
给定这些 ID 之一,我想从模型中查找并删除相应的行。现在我正在这样做:
void NetworkManager::removeSessionFromModel (QStandardItemModel *model, int sessionId) {
foreach (const QStandardItem *item, model->findItems("*", Qt::MatchWildcard)) {
if (item->data() == sessionId) {
model->removeRow(item->index().row());
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但该函数的每一行都让我感到畏缩。有没有更干净的方法来做到这一点?
我有一个QTreeView其中每个节点代表一个数据对象。我设法将指向该数据对象的指针打包到 a 中QVariant,以便我知道在树中选择了哪个。我可以通过该函数访问节点currentIndex()。
树的根位于QStandardItemModel::invisibleRootItem()。其他节点由父节点函数添加appendRow。所以这些项目没有row,column我可以在 中使用QStandardItemModel::item()。
有没有办法给节点提供有效的坐标或检索没有坐标的项目。
我QStandardItemModel在PySide中有一个,想删除某些行上的文本(这是一个待办事项列表应用程序,当任务完成时,我想删除文本)。鉴于QStandardItem显示的很好,根据文档,我尝试使用以下内容删除文本:
QStandardItem.setFont(QtGui.QFont.setStrikeOut(True))
Run Code Online (Sandbox Code Playgroud)
但是文本没有改变,并且出现错误:
TypeError: descriptor 'setStrikeOut' requires a 'PySide.QtGui.QFont' object but received a 'bool'
Run Code Online (Sandbox Code Playgroud) 如果我构造一个QStandardItem这样的:
item = QtGui.QStandardItem('Item Name')
Run Code Online (Sandbox Code Playgroud)
当这个项目被添加到一个QStandardItemModel模型并在一个模型中查看时,QTreeView我得到一个单元格,上面写着Item Name. 但是,当我构建一个像:
item = QtGui.QStandardItem()
item.setData(123)
Run Code Online (Sandbox Code Playgroud)
我得到一个空单元格,但我仍然可以通过调用来调用数据:
print(item.data())
Run Code Online (Sandbox Code Playgroud)
我会得到号码123。如何让数字实际显示在单元格中?
我正在使用PyQt4和python 2.7.9.我有一个包含Oracle数据库数据的QTreeView.代码是这样的:
model = QStandardItemModel(0,1)
self.treeMedia.setModel(model)
for rowalb in self.SELECT_TREE_ALBUM(codus):
nodeItem = QStandardItem(str(rowalb[1]).decode('utf-8'))
for rowph in self.SELECT_TREE_PHOTO(int(rowalb[0])):
childItem = QStandardItem(str(rowph[0]))
childItem.setEditable(False)
nodeItem.insertRows(0, [childItem])
nodeItem.setEditable(False)
model.appendRow(nodeItem)
model.setHorizontalHeaderLabels(['Data'])
Run Code Online (Sandbox Code Playgroud)
SELECT_TREE_ALBUM(codus是专辑所有者的id)和SELECT_TREE_PHOTO是从数据库返回数据的函数.rowalb 1是专辑的名称,rowalb [0]是ID,rowalb [0]用于获取这张专辑的照片.图为:

我想使用doubleclick事件获取childItem数据(例如1491475964461012,1491475821127693,1491475631127712,1491475141127761或1480407552234520).我试图将这些代码放入构造函数中:
self.treeMedia.doubleClicked.connect(self.treeMedia_doubleClicked)
Run Code Online (Sandbox Code Playgroud)
之后我添加了这个功能:
def treeMedia_doubleClicked(self,index):
item = self.treeMedia.model().item(index.row(),index.column())
strData = item.data(0).toPyObject()
#self.treeMedia.currentIndex()
print('' + str(strData))
Run Code Online (Sandbox Code Playgroud)
但有时我看到nodeItem信息(例如"恐怖"或"fotos de perfil")和其他我得到此错误:"AttributeError:'NoneType'对象没有属性'data'".可能是什么问题?是填写qtreeview的问题?或者是使用索引时双击事件功能的问题?请帮我.提前致谢.
qtreeview ×6
qt ×5
c++ ×3
pyqt ×3
python ×2
qt5 ×2
pyqt4 ×1
pyside ×1
python-2.7 ×1
qmodelindex ×1
qt-signals ×1
right-click ×1
text-styling ×1