ListView флажков в PyQt

import pandas as pd


df = pd.DataFrame(data={"col1": [1,1,100,1,1,100], 'col2': [1,1,100,1,1,100]})

# get list of columns (will be used later)
cols = df.columns

# create list of next division by 2 (will be used later)
original = 100
ll = []
for x in range(1, 20):
    ll.append(original)
    original /= 2

ll = list(zip([x for x in range(1, 20)], ll))

# create dictionary of indexes and divisions
dd = {x:y for x,y in ll}


for c in df.columns:
    df[f'{c}_next'] = df[c].shift(-1)

# main function get 1&100 pairs and replacing values
def compare_vals(row, cols):
    counter = 1
    for c in cols:
        if row[f'{c}_next'] == 100 and row[c] == 1:
            counter += 1

    for c in cols:
        if row[f'{c}_next'] == 100 and row[c] == 1:
            row[f'{c}_next'] = dd[counter]
    return row

df_new = df.apply(lambda row: compare_vals(row, cols), axis=1)

df_new = df_new[[x for x in df_new.columns if x not in cols]]
cols_new = {x: x.replace('_next', '') for x in df_new.columns}
df_new = df_new.rename(columns=cols_new)
df_new = df_new.shift(1)
df_new.iloc[0, :] = df.iloc[0,:]

ВЫХОД

   col1  col2
0   1.0   1.0
1   1.0   1.0
2  25.0  25.0
3   1.0   1.0
4   1.0   1.0
5  25.0  25.0
9
задан Marc Mutz - mmutz 26 July 2009 в 10:33
поделиться

2 ответа

Если вы пишете свою собственную модель, просто включите Qt.ItemIsUserCheckable флаг в возвращаемом значении из метода flags () и убедитесь, что вы возвращаете допустимое значение для Qt.CheckStateRole из метода data () .

Если вы используете класс QStandardItemModel , включите Qt. ItemIsUserCheckable в тех, которые вы передаете методу setFlags () каждого элемента, и устанавливаете проверку состояние для Qt.CheckStateRole с его методом setData () .

В интерактивном сеансе Python введите следующее:

from PyQt4.QtGui import *

model = QStandardItemModel()
item = QStandardItem("Item")
item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
item.setData(QVariant(Qt.Checked), Qt.CheckStateRole)
model.appendRow(item)

view = QListView()
view.setModel(model)
view.show()
9
ответ дан 4 December 2019 в 07:35
поделиться

В итоге я использовал метод, предоставленный Дэвидом Бодди в списке рассылки PyQt. Вот рабочий фрагмент, основанный на его коде:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from random import randint


app = QApplication(sys.argv)

model = QStandardItemModel()

for n in range(10):                   
    item = QStandardItem('Item %s' % randint(1, 100))
    check = Qt.Checked if randint(0, 1) == 1 else Qt.Unchecked
    item.setCheckState(check)
    item.setCheckable(True)
    model.appendRow(item)


view = QListView()
view.setModel(model)

view.show()
app.exec_()

Примечание: изменил вызов setData с ролью проверки на setCheckState и использовал setCheckable вместо флагов.

20
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: