Sending the signal to the classes I created in order
-
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> #include <QEvent> 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 &mindex); signals: void clickedDeleteBtnSignal(const QModelIndex &mindex); void clickedUpdateBtnSignal(const QModelIndex &mindex); private: QString _key=""; QWidget *editor = nullptr; }; #endif // BTNITEMDELEGATE_H
btnitemdelegate.cpp file;
#include "btnitemdelegate.h" #include "mainpage.h" #include "cstmbtnstyloption.h" #include "update.h" #include <QLabel> #include <QHBoxLayout> #include <QStyledItemDelegate> #include <QMessageBox> btnItemDelegate::btnItemDelegate(const QString key,QObject *parent) : QItemDelegate{parent},_key(key) { //Update *update = new Update(); //connect(this, &btnItemDelegate::clickedUpdateBtnSignal, this, &Update::updateBtnClickedSlot); } 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 &mindex) { Q_UNUSED(model) Q_UNUSED(option) Q_UNUSED(mindex) if (_key == "guncelle" && event->type() == QEvent::MouseButtonRelease) { emit clickedUpdateBtnSignal(mindex); // Güncelle düğmesi tıklama sinyali //return true; //yeni sinyal //emit Update::updateBtnClickedSlot(index); qDebug()<<"event update sinyal ok"; } /*CstmBtnStylOption updateButtonOption; updateButtonOption.rect = option.rect; if (event->type() == QEvent::MouseButtonPress) { //mouse tıklaması updateButtonOption.state |= QStyle::State_Sunken; } if (event->type() == QEvent::MouseButtonRelease) { //mouse tıklamasını bırakınca updateButtonOption.state &= ~QStyle::State_Sunken; } /*if (event->type() == QEvent::MouseButtonDblClick) { } //buton rengi updateButtonOption.palette.setColor(QPalette::Button, Qt::blue); //butonu tekrar çizmek için QPainter update etme QPainter painter(editor); QApplication::style()->drawControl(QStyle::CE_PushButton, &updateButtonOption, &painter, editor);*/ //return true; return QItemDelegate::editorEvent(event, model, option, mindex); //default }
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; 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); //updatePage 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(); } 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) { if (mindex.isValid()) { int rowIndex = mindex.row(); qDebug() << "Güncelle butonuna tıklandı. Satır indeksi: " << rowIndex; auto itemID = queryModel->data(queryModel->index(rowIndex, 0), Qt::DisplayRole).toInt(); Update *update = new Update(itemID, this); //id yi update e iletme update->setWindowTitle("Update Page"); update->setWindowIcon(QIcon(":/icon/icons/updatepage.png")); update->setWindowFlags( Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint); update->setModal(true); update->adjustSize(); update->setFixedSize(1000,150); update->show(); }else { qDebug()<<"error index"; } } 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; }
update.h file;
#ifndef UPDATE_H #define UPDATE_H #include <QDialog> #include "mainpage.h" namespace Ui { class Update; } class Update : public QDialog { Q_OBJECT public: explicit Update(int itemID,QWidget *parent = nullptr); ~Update(); public slots: void updateBtnClickedSlot(const QModelIndex &mindex); signals: void clickedUpdateBtnSignal(const QModelIndex &mindex); //yeni sinyal tanımlama private: Ui::Update *ui; }; #endif // UPDATE_H
update.cpp file;
#include "update.h" #include "ui_update.h" #include "btnitemdelegate.h" //#include "mainpage.h" #include <QAbstractItemModel> #include <QStyleOptionViewItem> Update::Update(int itemID,QWidget *parent) : QDialog(parent), ui(new Ui::Update) { ui->setupUi(this); } Update::~Update() { delete ui; } void Update::updateBtnClickedSlot(const QModelIndex &mindex) { if (mindex.isValid()) { int rowIndex = mindex.row(); qDebug() << "Güncelle butonuna tıklandı. Satır indeksi: " << rowIndex; //burada Update sınıfını kullanarak güncelleme işlemleri Update *update; update->setWindowTitle("Update Page"); update->setWindowIcon(QIcon(":/icon/icons/updatepage.png")); update->setWindowFlags( Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint); update->setModal(true); update->adjustSize(); update->setFixedSize(1000,150); update->show(); }else { qDebug()<<"error index"; } }
The classes and codes I created are as above. I want to do this. I want to send a signal to the mainpage class by triggering an event from the btnitemdelegate class. I want to forward the signal coming to this mainpage class to the update class. I want to start the update process with this signal. How can I do that? Thanks
-
Create a signal in MainPage, connect it to a slot in Update when you create the object and emit the newly created signal when the signal from the delegates comes in.
-
@Christian-Ehrlicher Thank you for your answers. Could you please show what you said with an example? Thanks.
-
@yy_pc_programmer said in Sending the signal to the classes I created in order:
Could you please show what you said with an example? Thanks.
Waht exactly? You already defined signals and slots in your other classes so do so in your Update and MainPage classes and connect them as you already did elsewhere.
-
@Christian-Ehrlicher I understand now. thanks
-
Y yy_pc_programmer has marked this topic as solved on