LINUX.ORG.RU

Два дерева и кнопка

 ,


0

1

Всем привет! У меня есть два дерева, QTreeView, и одна кнопка QPushButton. Как мне понять item какого дерева сейчас выделен? Ну т.е, по кнопке я вывожу название item-а какого либо дерева, а как понять с каким из двух мы работаем сейчас? Я сделал вот такие костыли:

def button(self):
    index = self.treeView1.currentIndex()
    node = index.internalPointer()
    if node is not None:
         print("Выделен item дерева 1: " + node.name())
    else:
         index = self.treeView2.currentIndex()
         node = index.internalPointer()
         print("Выделен item дерева 2: " + node.name())
В принципе работает, но хочется научиться делать хорошо и правильно. Прошу подсказки! Заранее спасибо!


Ответ на: комментарий от aarexer

К сожалению, не могу ничем помочь. Не смог удержаться не вспомнить затерроризировавшего Development юзера со взором и проектом горящими. И по-моему, PyQt довольно популярный биндинг, неужели нужная информация не гуглится?

Virtuos86 ★★★★★
()
Ответ на: комментарий от Deleted

Как дела, бизуша? Анал цел ещё?

anonymous
()
#!/usr/bin/python3

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

m = QtGui.QStandardItemModel(5, 2)
for r in range(5):
  for c in range(2):
    m.setData(m.index(r,c),"%d,%d" % (r,c))

c = None
def click(self):
  print(c)

def change(self):
  global c
  c = self

class Tree(QtWidgets.QTreeView):
  signalChanged = QtCore.pyqtSignal(object, object, object)
  def currentChanged(self, c, p):
    self.signalChanged.emit(self, c, p)

a = QtWidgets.QApplication(sys.argv)

w = QtWidgets.QWidget()
g = QtWidgets.QGridLayout()
for j in range(2):
  tree = Tree()
  tree.setModel(m)
  tree.signalChanged.connect(change)
  g.addWidget(tree, 0,j)
b = QtWidgets.QPushButton()
b.clicked.connect(click)
g.addWidget(b, 1,0, 1,2)
w.setLayout(g)

w.show()
a.exec()
anonymous
()
Ответ на: комментарий от anonymous

Или так (сорри что на плюсах)

connect(ui->treeView_1->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
connect(ui->treeView_2->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection)));

...

void MainWindow::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
    qDebug() << selected.indexes();
}
neversleep ★★
()
Ответ на: комментарий от neversleep
connect(ui->treeView_1->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection)));
connect(ui->treeView_2->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection)));

Make me unseen it!

mix_mix ★★★★★
()
Ответ на: комментарий от anonymous

Действительно, затупил. На самом деле, хотел лишь указать на сигнал selectionChanged, который мог бы быть вполне юзабелен, для задач вроде:

node = index.internalPointer()
print("Выделен item дерева 2: " + node.name())
neversleep ★★
()
Ответ на: комментарий от anonymous

или

#!/usr/bin/python3

import sys
import random
from PyQt5 import QtCore, QtGui, QtWidgets

class State:
  currentTree = None
  def treeClick(mi):
    State.currentTree = mi.model().sender()
  def btnClick():
    rgb = tuple(random.randint(0,255)
      for _ in range(3))
    State.currentTree.setStyleSheet(
      'background-color:rgb(%d,%d,%d)' % rgb)

a = QtWidgets.QApplication(sys.argv)

w = QtWidgets.QWidget()
g = QtWidgets.QGridLayout()
for j in range(2):
  m = QtGui.QStandardItemModel(5, 2)
  for r in range(5):
    for c in range(2):
      m.setData(m.index(r,c),"%d,%d" % (r,c))
  t = QtWidgets.QTreeView()
  t.setModel(m)
  t.clicked.connect(State.treeClick)
  g.addWidget(t, 0,j)
b = QtWidgets.QPushButton()
b.clicked.connect(State.btnClick)
g.addWidget(b, 1,0, 1,2)
w.setLayout(g)

w.show()
a.exec()

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.