Как вставить QPushButton в TableView? - PullRequest
4 голосов
/ 04 мая 2010

Я реализую QAbstractTableModel, и я хотел бы вставить QPushButton в последний столбец каждой строки. Когда пользователи нажимают на эту кнопку, появляется новое окно с дополнительной информацией об этой строке.

У вас есть идеи, как вставить кнопку? Я знаю о делегировании системы, но все примеры только о том, «как редактировать цвет с помощью поля со списком» ...

Ответы [ 3 ]

5 голосов
/ 15 мая 2014

Вы можете использовать

QPushButton* viewButton = new QPushButton("View");    
tableView->setIndexWidget(model->index(counter,2), viewButton);
3 голосов
/ 04 мая 2010

Архитектура вида модели не предназначена для вставки виджетов в разные ячейки, но вы можете нарисовать кнопку внутри ячейки.

Различия:

  1. Это будет только рисунок кнопки
  2. Без дополнительной работы (возможно, немного дополнительной работы) кнопка не будет выделена при наведении мыши
  3. Вследствие # 1 выше, вы не можете использовать сигналы и слоты

Тем не менее, вот как это сделать:

Подкласс QAbstractItemDelegate (или QStyledItemDelegate ) и реализация метода paint(). Чтобы нарисовать кнопочный элемент управления (или любой другой элемент управления в этом отношении), вам нужно использовать стиль или метод QStylePainter::drawControl():

class PushButtonDelegate : public QAbstractItemDelegate
{
    // TODO: handle public, private, etc.
    QAbstractItemView *view;

    public PushButtonDelegate(QAbstractItemView* view)
    {
        this->view = view;
    }

    void PushButtonDelegate::paint(
        QPainter* painter,
        const QStyleOptionViewItem & option,
        const QModelIndex & index
        ) const 
    {
        // assuming this delegate is only registered for the correct column/row
        QStylePainter stylePainter(view);
        // OR: stylePainter(painter->device)

        stylePainter->drawControl(QStyle::CE_PushButton, option);
        // OR: view->style()->drawControl(QStyle::CE_PushButton, option, painter, view);
        // OR: QApplication::style()->drawControl(/* params as above */);
    }
}

Поскольку делегат удерживает вас в области представления модели, используйте сигналы представлений о выборе и изменениях, чтобы открыть ваше информационное окно.

0 голосов
/ 20 октября 2011

Вы можете использовать setCellWidget(row,column,QWidget*) для установки виджета в определенной ячейке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...