Applying a style to a QTableView object
-
Hello, I subclassified the btnItemDelegate class in the codes I wrote. What I want to do is this; For each data added to the QTableView object, I added 2 buttons at the end of the line. To give these buttons CSS features, I wanted to subclassify the btnItemDelegate class and give them a hover effect with the mouse. But the style was not applied. What is the reason for this?
- The codes I wrote are as follows:
btnitemdelegate.h file:
#ifndef BTNITEMDELEGATE_H #define BTNITEMDELEGATE_H #include <QItemDelegate> #include <QObject> #include <QModelIndex> #include <QStyleOptionButton> #include <QStyleOptionViewItem> #include <QPainter> #include <QItemDelegate> #include <QSqlQueryModel> #include <QPushButton> #include <QApplication> #include <QMouseEvent> #include <QDialog> #include <QMessageBox> class btnItemDelegate : public QItemDelegate { Q_OBJECT public: btnItemDelegate(const QString key,QObject *parent = nullptr); // QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; //void setEditorData(QWidget *editor, const QModelIndex &index) const override; //void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; // bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); signals: void clickedDeleteBtnSignal(const QModelIndex &mIndex); void clickedUpdateBtnSignal(const QModelIndex &mIndex); private: QString _key=""; }; #endif // BTNITEMDELEGATE_H
btnitemdelegate.cpp file;
#include "btnitemdelegate.h" #include "mainpage.h" #include "cstmbtnstyloption.h" #include <QLabel> #include <QHBoxLayout> #include <QStyledItemDelegate> #include <QMessageBox> btnItemDelegate::btnItemDelegate(const QString key,QObject *parent) : QItemDelegate{parent},_key(key) { } /* QWidget *btnItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { QWidget *editor = new QWidget(parent); QHBoxLayout *layout = new QHBoxLayout(editor); layout->setContentsMargins(0, 0, 0, 0); QPushButton *deleteBtn = new QPushButton("Sil", editor); QPushButton *updateBtn = new QPushButton("Güncelle", editor); layout->addWidget(deleteBtn); layout->addWidget(updateBtn); editor->setLayout(layout); return editor; } */ void btnItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(_key=="delete") { CstmBtnStylOption deleteButtonOption; // QStyleOptionButton deleteButtonOption; QRect deleteRect = option.rect;//hücrenin dikdörtgeni int x,y,w,h; x = deleteRect.left() + deleteRect.width() - 90;// X coordinate y = deleteRect.top(); w = 80; h = 30; deleteButtonOption.rect = QRect(x,y,w,h); // Sil düğmesi konumu deleteButtonOption.features = QStyleOptionButton::None; // Düğme özellikleri deleteButtonOption.state = QStyle::State_Enabled; // Düğme durumu QIcon icon(":/icon/icons/deletebtn.png"); deleteButtonOption.icon = icon; deleteButtonOption.iconSize = QSize(25,25); //deleteButtonOption.palette.setColor(QPalette::Button, deleteButtonOption.getBtnColor()); QApplication::style()->drawControl( QStyle::CE_PushButton, &deleteButtonOption, painter); } else if(_key=="guncelle") { CstmBtnStylOption updateButtonOption; //QStyleOptionButton updateButtonOption; QRect updateRect = option.rect;//hücrenin dikdörtgeni int x2,y2,w2,h2; x2 = updateRect.left() + updateRect.width() - 90;// X coordinate y2 = updateRect.top(); w2 = 80; h2 = 30; updateButtonOption.rect = QRect(x2,y2,w2,h2); updateButtonOption.features = QStyleOptionButton::None; //Düğme özellikleri updateButtonOption.state = QStyle::State_Enabled; //Düğme durumu QIcon icon2(":/icon/icons/updatebutton.png"); updateButtonOption.icon = icon2; updateButtonOption.iconSize = QSize(25,25); //updateButtonOption.palette.setColor(QPalette::Button, updateButtonOption.getBtnColor()); QApplication::style()->drawControl( QStyle::CE_PushButton, &updateButtonOption, painter); } else{ qDebug()<<"tanimsiz key"; } } /*void btnItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { }*/ /*void btnItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { }*/ void btnItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); } /* bool btnItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { Q_UNUSED(model) Q_UNUSED(option) Q_UNUSED(index) return true; } */
cstmbtnstyloption.h file;
#ifndef CSTMBTNSTYLOPTION_H #define CSTMBTNSTYLOPTION_H #include <QStyleOptionButton> #include <QObject> #include <QColor> class CstmBtnStylOption : public QStyleOptionButton { public: CstmBtnStylOption(); QColor getBtnColor() const; // Butonun rengini döndürme QRect getButtonRect() const; // Butonun boyutunu döndürme public: QColor normalColor; QColor hoverColor; QColor clickedColor; bool isClicked; bool hovered; }; #endif // CSTMBTNSTYLOPTION_H
cstmbtnstyloption.cpp file;
#include "cstmbtnstyloption.h" #include "btnitemdelegate.h" CstmBtnStylOption::CstmBtnStylOption() { QColor normalColor = Qt::green; QColor hoverColor = Qt::blue; QColor clickedColor = Qt::blue; bool isClicked = false; bool hovered = false; } QColor CstmBtnStylOption::getBtnColor() const { if (isClicked) { return clickedColor; } else if (hovered) { return hoverColor; } else { return normalColor; } } QRect CstmBtnStylOption::getButtonRect() const { if (isClicked) { return rect.adjusted(2, 2, -2, -2); } else { return rect; } }
mainpage.h file;
#ifndef MAINPAGE_H #define MAINPAGE_H #include "giriswidget.h" #include "btnitemdelegate.h" #include "addpage.h" #include "detailpage.h" #include "update.h" #include <QDialog> #include <QTableView> #include <QSql> #include <QSqlDatabase> #include <QSqlQueryModel> #include <QSqlQuery> #include <QStandardItemModel> #include <QPushButton> #include <QModelIndex> namespace Ui { class MainPage; } class MainPage : public QDialog { Q_OBJECT public: explicit MainPage(QWidget *parent = nullptr); ~MainPage(); void connectDb(); void addBtn_Page_Clicked(); void onStatus(); void detailBtn_Page_Clicked(); void clickedLogOutBtn_Clicked(); void updateTableView(); void myview_stil_layout(); public slots: void updateBtnClickedSlot(const QModelIndex &mindex); void deleteBtnClickedSlot(const QModelIndex &mindex); //int sevkHesaplama(); public: Ui::MainPage *ui; AddPage *add; DetailPage *detail; QSqlDatabase mydb; QSqlQueryModel *queryModel; QSqlQueryModel *queryModelDelete; QStandardItemModel *itemModelBtn; QPushButton *deleteBtn; QPushButton *updateBtn; Update *update; const int ID={}; }; #endif // MAINPAGE_H
mainpage.cpp file;
#include "mainpage.h" #include "ui_mainpage.h" #include "giriswidget.h" #include "btnitemdelegate.h" #include "addpage.h" #include "detailpage.h" #include "update.h" #include <QMessageBox> #include <QDebug> #include <QSqlError> #include <QHeaderView> #include <QSqlQueryModel> #include <QStringList> #include <QWidget> #include <QModelIndex> #include <QObject> MainPage::MainPage(QWidget *parent) : QDialog(parent), ui(new Ui::MainPage) { ui->setupUi(this); connectDb(); onStatus(); updateTableView(); connect(ui->logOutBtn,&QPushButton::clicked,this,&MainPage::clickedLogOutBtn_Clicked); connect(ui->addBtn,&QPushButton::clicked,this,&MainPage::addBtn_Page_Clicked); connect(ui->detailBtn,&QPushButton::clicked,this,&MainPage::detailBtn_Page_Clicked); btnItemDelegate *btnDlgte = new btnItemDelegate("delete",ui->myView); connect(btnDlgte, &btnItemDelegate::clickedDeleteBtnSignal, this, &MainPage::deleteBtnClickedSlot); connect(btnDlgte, &btnItemDelegate::clickedUpdateBtnSignal, this, &MainPage::updateBtnClickedSlot); queryModel->insertColumn(queryModel->columnCount()); queryModel->setHeaderData(queryModel->columnCount()-1, Qt::Horizontal, tr("Sil")); ui->myView->setItemDelegateForColumn(queryModel->columnCount()-1,btnDlgte); //ok btnItemDelegate *btnUpdate = new btnItemDelegate("guncelle",ui->myView); queryModel->insertColumn(queryModel->columnCount()); queryModel->setHeaderData(queryModel->columnCount()-1, Qt::Horizontal, tr("Güncelle")); ui->myView->setItemDelegateForColumn(queryModel->columnCount()-1,btnUpdate); //ok ui->myView->setSelectionBehavior(QAbstractItemView::SelectItems); ui->myView->setModel(queryModel); } void MainPage::connectDb() { mydb = QSqlDatabase::addDatabase("QMYSQL"); mydb.setHostName("localhost"); mydb.setDatabaseName("krn_iplikler"); mydb.setUserName("root"); mydb.setPassword("root"); mydb.setPort(3306); mydb.open(); if (mydb.isOpen()) { qDebug()<<"db connection is succesfully"; } else { QMessageBox::information(this,"Connection Failed.!","Database connection failed!!!!",QMessageBox::Cancel); qDebug()<<mydb.lastError().text(); } } void MainPage::addBtn_Page_Clicked() { add->setWindowTitle("Add Page"); add->setWindowIcon(QIcon(":/icon/icons/add.png")); add->setWindowFlags( Qt::WindowMinimizeButtonHint); add->setModal(true); add->adjustSize(); add->setFixedSize(1000,150); add->show(); } void MainPage::onStatus() { add = new AddPage(); detail = new DetailPage(); update = new Update(); } void MainPage::detailBtn_Page_Clicked() { detail->setWindowTitle("Details Page"); detail->setWindowIcon(QIcon(":/icon/icons/detail.png")); detail->setWindowFlags( Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint); detail->setModal(true); detail->adjustSize(); detail->setFixedSize(600,400); detail->show(); } void MainPage::clickedLogOutBtn_Clicked() { this->close(); GirisWidget *giris = new GirisWidget(); giris->setWindowTitle("Login Page"); giris->adjustSize(); giris->setFixedSize(450,350); giris->setWindowIcon(QIcon(":/icon/icons/login.png")); giris->setWindowFlags( Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint); giris->show(); } void MainPage::updateTableView() { queryModel = new QSqlQueryModel(); queryModel->setQuery("SELECT * FROM iplikler",mydb); ui->myView->setModel(queryModel); myview_stil_layout(); } void MainPage::myview_stil_layout() { if (!queryModel) { return; } QStringList headernames; headernames <<"Sıra No"<<"Admin Adı"<<"Admin Parola"<<"Kullanıcı Adı"<<"Kullanıcı Parola"<<"Boyanan Miktar"<<"Cari Kodu"<<"Cari Adı"<<"Depodan Rezerv" <<"İplik Kodu"<<"İplik Adı"<<"Miktar"<<"Onay Zamanı"<<"Özel Notu"<<"Renk Kodu"<<"Renk Adı"<<"Sevk Edilecek Miktar"<<"Sevk Miktarı"; for (int i = 0; i < headernames.size(); ++i) { queryModel->setHeaderData(i, Qt::Horizontal, headernames[i]); } ui->myView->setStyleSheet("QHeaderView::section { background-color: lightblue ; color: black; font-weight: bold;}"); ui->myView->setModel(queryModel); ui->myView->verticalHeader()->setVisible(false); QHeaderView *horizontalHeader = ui->myView->horizontalHeader(); horizontalHeader->setResizeContentsPrecision(QHeaderView::ResizeToContents); } void MainPage::updateBtnClickedSlot(const QModelIndex &mindex) { update->setWindowTitle("Update Page"); update->setWindowIcon(QIcon(":/icon/icons/updatepage.png")); update->setWindowFlags( Qt::WindowMinimizeButtonHint); update->setModal(true); update->adjustSize(); update->setFixedSize(1000,150); update->show(); } void MainPage::deleteBtnClickedSlot(const QModelIndex &mindex) { int rowIndex = mindex.row(); QModelIndex modelIndex = queryModel->index(rowIndex,0); const int ID = queryModel->data(modelIndex,Qt::DisplayRole).toInt(); QSqlQuery deleteQuery; deleteQuery.prepare("DELETE FROM iplikler WHERE ID = :secilenID "); deleteQuery.bindValue(":secilenID",ID); if (deleteQuery.exec()) { qDebug()<<"veri silindi"; queryModel->setQuery("SELECT * FROM iplikler",mydb); queryModel->insertColumn(queryModel->columnCount()); queryModel->setHeaderData(queryModel->columnCount()-1, Qt::Horizontal, tr("Sil")); queryModel->insertColumn(queryModel->columnCount()); queryModel->setHeaderData(queryModel->columnCount()-1, Qt::Horizontal, tr("Güncelle")); ui->myView->setModel(queryModel); } else{ qDebug() << "Satır silinirken hata oluştu:" << deleteQuery.lastError().text(); } } /*int MainPage::sevkHesaplama() { }*/ MainPage::~MainPage() { delete ui; }
- The codes I wrote are as follows:
-
Hi,
If you want to do styled painting you should rather use the QStyledItemDelegate as a base.
Next, how do you expect the default QStyle to make use of your custom options ? It knows nothing about them. Depending on what you want to achieve you should write a proxy style that make use of your custom options.