Как создать подкласс виджета, чтобы добавить к нему больше элементов?

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

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

3 ответа

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

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

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

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

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

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

Другие вопросы по тегам