2016-03-15 4 views
0

Я пытаюсь переписать некоторый код PyQt C++ в python. Я делал это преобразование синтаксиса много раз, но не с таким примером подкласса, как этот. Этот код C++ предназначен для того, чтобы вы могли добавлять comboboxes в заголовок QTableWidget, чтобы действовать аналогично фильтрам заголовков Excel. Я могу преобразовать большую часть логики, но мне нужна помощь с синтаксисом подкласса в python для этого примера. Любая помощь приветствуется.Qt Преобразование синтаксиса из C++ в PyQt

MyHorizontalHeader(QWidget *parent = 0) : QHeaderView(Qt::Horizontal, parent) 
{ 
    connect(this, SIGNAL(sectionResized(int, int, int)), this, 
      SLOT(handleSectionResized(int))); 
    connect(this, SIGNAL(sectionMoved(int, int, int)), this, 
      SLOT(handleSectionMoved(int, int, int))); 
    setMovable(true); 
} 

void showEvent(QShowEvent *e) 
{ 
    for (int i=0;i<count();i++) { 
     if (!boxes[i]) { 
      QComboBox *box = new QComboBox(this); 
      boxes[i] = box; 
     } 
     boxes[i]->setGeometry(sectionViewportPosition(i), 0, 
           sectionSize(i) - 5, height()); 
     boxes[i]->show(); 
    } 
    QHeaderView::showEvent(e); 
} 

void handleSectionResized(int i) 
{ 
    for (int j=visualIndex(i);j<count();j++) { 
     int logical = logicalIndex(j); 
     boxes[logical]->setGeometry(sectionViewportPosition(logical), 0, 
             sectionSize(logical) - 5, height()); 
    } 
} 

void handleSectionMoved(int logical, int oldVisualIndex, int newVisualIndex) 
{ 
    for (int i=qMin(oldVisualIndex, newVisualIndex);i<count();i++){ 
     int logical = logicalIndex(i); 
     boxes[logical]->setGeometry(sectionViewportPosition(logical), 0, 
             sectionSize(logical) - 5, height()); 
    } 
} 

void scrollContentsBy(int dx, int dy) 
{ 
    QTableWidget::scrollContentsBy(dx, dy); 
    if (dx != 0) 
     horizHeader->fixComboPositions(); 
} 

void fixComboPositions() 
{ 
    for (int i=0;i<count();i++) 
     boxes[i]->setGeometry(sectionViewportPosition(i), 0, 
           sectionSize(i) - 5, height()); 
} 

Этот пример исходный код родом из http://blog.qt.io/blog/2012/09/28/qt-support-weekly-27-widgets-on-a-header/

Я надеюсь, что в конечном итоге создать пользовательский подкласс, который я могу содействовать мой QTableWidgets в «Qt Designer», в результате чего я могу иметь собственный QTableWidget QHeaderView с COMBOBOX фильтрами ,

+1

Можете ли вы портировать все, что вы * делаете, понять сначала, так что вам легче увидеть, с какими конкретными частями вы сталкиваетесь с problerms? – ekhumoro

+0

Это строка, с которой у меня возникают проблемы ... MyHorizontalHeader (QWidget * parent = 0): QHeaderView (Qt :: Horizontal, parent) – panofish

ответ

2

подклассов в PyQt/PySide начинается так:

class MyHorizontalHeader(QHeaderView): 

    def __init__(self, parent=None): 
     super(MyHorizontalHeader, self).__init__(Qt.Horizontal, parent) 

    def otherMethod(self): 
     ... 
    ... 

Первая строка определяет имя класса и возможность наследования.

Метод __init__ вызывается при создании экземпляра класса. Всегда нужно вызвать метод __init__ класса, на который он наследует (это относится к PyQt/PySide), который выполняется с помощью super.