Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Applying a style to a QTableView object

Applying a style to a QTableView object

Scheduled Pinned Locked Moved Unsolved General and Desktop
2 Posts 2 Posters 274 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • yy_pc_programmerY Offline
    yy_pc_programmerY Offline
    yy_pc_programmer
    wrote on last edited by
    #1

    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;
    }
    
    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      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.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      1

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved