2017-08-22 33 views
0

QTableviewQAbstractTableModelを使用して1つのテーブルを作成しました。最後の列では、すべての行(そのセルの右隅)にボタンを追加することもできます。今度は、背景色を黒、境界線などに変更するなど、スタイルをカスタマイズしたいと考えています。QTableviewに追加されたボタンにカスタムスタイルを追加する

これを達成する方法はありますか?

+0

どのようにボタンを追加しましたか? –

答えて

0

delegate.h:

class MyDelegate : public QItemDelegate { 
    Q_OBJECT 

public: 
    MyDelegate(QObject *parent = 0); 
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; 
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); }; 

delegate.cpp:

#include <QtGui> #include "delegate.h" 

MyDelegate::MyDelegate(QObject *parent) 
    : QItemDelegate(parent) { } 


void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { 
    QStyleOptionButton button; 
    QRect r = option.rect;//getting the rect of the cell 
    int x,y,w,h; 
    x = r.left() + r.width() - 30;//the X coordinate 
    y = r.top();//the Y coordinate 
    w = 30;//button width 
    h = 30;//button height 
    button.rect = QRect(x,y,w,h); 
    button.text = "=^.^="; 
    button.state = QStyle::State_Enabled; 

    QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter); } 

bool MyDelegate::editorEvent(QEvent *event, QAbstractItemModel 
*model, const QStyleOptionViewItem &option, const QModelIndex &index) { 
    if(event->type() == QEvent::MouseButtonRelease) 
    { 
     QMouseEvent * e = (QMouseEvent *)event; 
     int clickX = e->x(); 
     int clickY = e->y(); 

     QRect r = option.rect;//getting the rect of the cell 
     int x,y,w,h; 
     x = r.left() + r.width() - 30;//the X coordinate 
     y = r.top();//the Y coordinate 
     w = 30;//button width 
     h = 30;//button height 

     if(clickX > x && clickX < x + w) 
      if(clickY > y && clickY < y + h) 
      { 
       QDialog * d = new QDialog(); 
       d->setGeometry(0,0,100,100); 
       d->show(); 
      } 
    } } 

main.cppに

#include "delegate.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 

    QStandardItemModel model(4, 2); 
    QTableView tableView; 
    tableView.setModel(&model); 

    MyDelegate delegate; 
    tableView.setItemDelegate(&delegate); 

    tableView.horizontalHeader()->setStretchLastSection(true); 
    tableView.show(); 
    return app.exec(); } 
+0

こんにちはtanmayb、あなたの質問の補足のように見える答えを投稿しました。その場合は、質問を編集して「回答」を削除してください。 – bummi

0

IMO最善のアプローチは、スタイルシートを使用することです。 http://doc.qt.io/qt-5/stylesheet-syntax.html http://doc.qt.io/qt-5/stylesheet-reference.html

qApp->setStylSheet("QTableview QPushButton {" // apply only on push buttons inside a table view 
    " background-color: red;" 
    " border-style: outset;" 
    " border-width: 2px;" 
    " border-color: beige;" 
    "}"); 
+0

本当ですか? ボタンだけでなく、すべてのテーブルビューのスタイルが変更されることがあります。 – tanmayb

+0

最初のリンクセクションの 'Selector Types'テーブル行に' Descendant Selector'を表示してください。したがって、これはテーブルビュー内のボタンにのみ影響します。それをテストしませんでしたが、うまくいくはずです。 –

+0

それを試してみるのが一番です。 AFAIKスタイルシートには、望ましくない副作用があります。使用しているスタイルによって異なります(通常はプラットフォームに依存します)。 –

関連する問題