Как создать подкласс виджета, чтобы добавить к нему больше элементов? - PullRequest
4 голосов
/ 14 июня 2009

Я пытаюсь создать подкласс QTableView со встроенным QLineEdit вверху для фильтрации результатов по мере ввода. Мне нужно, чтобы у моей таблицы был тот же API, что и у обычного QTableView, поэтому я хочу создать ее подкласс, а не подкласс QWidget и добавить к ней QLineEdit и QTableView.

Я подумал, что могу просто заново реализовать paintEvent(QPaintEvent*), изменить QPaintEvent s rect(), чтобы начать немного ниже (высота QLineEdit, поэтому он рисует под ним), а затем передать его через на QTableView::paintEvent(), но аргумент QPaintEvent указывает только на то, какая область должна быть перекрашена, а не область, где должен быть нарисован виджет.

Ответы [ 3 ]

7 голосов
/ 14 июня 2009

Все, что вы делаете в этом отношении, будет хакерским и приведет к такой же большой работе (возможно, больше работы), что и ручное сопоставление всех сигналов и слотов с дочерним виджетом. Вам нужно будет сделать гораздо больше, чем просто изменить события рисования, вам также необходимо настроить все события мыши, настроить любые прямоугольники обновления и т. Д.

В качестве альтернативы вы можете просто взять класс QTableView из источника Qt и изменить его напрямую (хотя это, вероятно, нарушит LGPL и потребует публикации вашего источника, если у вас нет коммерческой лицензии.) Но самый простой чистый метод собирается реализовать контейнерный виджет с QTableView как дочерний элемент.

1 голос
/ 17 июня 2009

Я должен согласиться с Дэниелом: я не думаю, что это правильный подход. Вероятно, вы захотите создать собственный виджет с редактированием строки для выполнения фильтрации. В противном случае вы попадете в сложный мир хакерства Qt.

Если вам действительно необходимо предоставить доступ к интерфейсу QTableView, просто добавьте открытый метод get, который возвращает ссылку на таблицу.

Это несколько похоже на то, как Qt предоставляет класс QTabWidget, который наследует QWidget, но имеет закрытый QTabBar, который он использует для внутреннего использования. Одно существенное отличие состоит в том, что он предоставляет защищенный метод доступа tabBar (), а не общедоступный.

1 голос
/ 14 июня 2009

Я бы попробовал переопределить paintEvent, изменив widget::pos на немного ниже, чем он есть, и вызвать QTableView::paintEvent()

...