QTableview
とQAbstractTableModel
を使用して1つのテーブルを作成しました。最後の列では、すべての行(そのセルの右隅)にボタンを追加することもできます。今度は、背景色を黒、境界線などに変更するなど、スタイルをカスタマイズしたいと考えています。QTableviewに追加されたボタンにカスタムスタイルを追加する
これを達成する方法はありますか?
QTableview
とQAbstractTableModel
を使用して1つのテーブルを作成しました。最後の列では、すべての行(そのセルの右隅)にボタンを追加することもできます。今度は、背景色を黒、境界線などに変更するなど、スタイルをカスタマイズしたいと考えています。QTableviewに追加されたボタンにカスタムスタイルを追加する
これを達成する方法はありますか?
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(); }
こんにちはtanmayb、あなたの質問の補足のように見える答えを投稿しました。その場合は、質問を編集して「回答」を削除してください。 – bummi
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;"
"}");
本当ですか? ボタンだけでなく、すべてのテーブルビューのスタイルが変更されることがあります。 – tanmayb
最初のリンクセクションの 'Selector Types'テーブル行に' Descendant Selector'を表示してください。したがって、これはテーブルビュー内のボタンにのみ影響します。それをテストしませんでしたが、うまくいくはずです。 –
それを試してみるのが一番です。 AFAIKスタイルシートには、望ましくない副作用があります。使用しているスタイルによって異なります(通常はプラットフォームに依存します)。 –
どのようにボタンを追加しましたか? –