Getting the right click signal from a custom button
Unsolved
General and Desktop
-
hi, the following code creates a Qbuttongroup and an event when left clicking on each button.
There should be different events for right clicks I want to to catch with an event where to put some code as C++ (not stylesheet), and while I use the same sender than for the left click, the event never rise why ?GuiMatrix::GuiMatrix(uint Rows, uint Cols, quint32 Led_colors, QWidget * parentWidget, QVector< QPair<QString, QRgb> >& ColorsList ) : MatxRows(Rows), MatxCols(Cols), GUIMtx_BtnColorsArray(MatxRows * MatxCols, BTNCOLOR_GREY), Palette() { setParent(parentWidget) ; QVBoxLayout *layout = new QVBoxLayout() ; QHBoxLayout *Hlayout = new QHBoxLayout() ; Glayout = new QGridLayout() ; Glayout->setSpacing(0) ; Hlayout->addStretch(1) ; Hlayout->addLayout(Glayout) ; Hlayout->addStretch(1) ; layout->addLayout(Hlayout) ; layout->addStretch(1) ; Populate(Glayout,Rows,Cols); if ( ColorsList.size() ==0 ) { for (uint ind; ind <Led_colors; ind++) Palette[ind]= ind ; } else { for (auto iter: ColorsList ) { Palette<< iter.second ; } } parentWidget->setLayout(layout) ; connect(this , SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(buttonClick(QAbstractButton*))); // This is not working connect(this , SIGNAL(rightClicked()),this,SLOT(rightClicked())); } void GuiMatrix::Populate(QGridLayout *layout, const int rows, const int cols) { for ( int i = 0; i < rows; ++ i) { for ( int j = 0; j < cols; ++j) { MatrixButton *btn= new MatrixButton(); btn->setFixedWidth(20); btn->setStyleSheet("QPushButton{background-color:#A0A0A0;}" "QPushButton[_rightClicked = true]{background-color:#A0A0A0;}") ; layout->addWidget(btn,i,j) ; this->addButton(btn) ; } } } void GuiMatrix::rightClicked() { qDebug() <<"right click" ; } void GuiMatrix::buttonClick(QAbstractButton* button) { int BtnID= abs(this->id(button)) -2 ; QRgb BtnColorValue = GUIMtx_BtnColorsArray[BtnID]; int indexPalette = Palette.indexOf(BtnColorValue) ; if (BtnColorValue == BTNCOLOR_GREY) // The 1st time the let button is grey (off) GUIMtx_BtnColorsArray[BtnID]= Palette.first() ; else if (indexPalette != -1 ) // we have found the color in the list { if ( Palette[indexPalette] == Palette.last() ) GUIMtx_BtnColorsArray[BtnID]= Palette.first() ; else GUIMtx_BtnColorsArray[BtnID]= Palette[++indexPalette] ; } else qDebug() << "buttonClick problem, the color is not in the Palette list: " <<BtnColorValue ; // if not: there is a problem BtnColorValue = GUIMtx_BtnColorsArray[BtnID] ; QString ColorString = "QPushButton{background-color: " + QString("#%1").arg(BtnColorValue, 6, 16, QLatin1Char( '0' )) + ";} " "QPushButton[_rightClicked = true]{background-color:#A0A0A0;} "; button->setStyleSheet(ColorString) ; }
The right clicked event is coming for the emit in the base class :
#ifndef MATRIXBUTTON_H #define MATRIXBUTTON_H #include <QPushButton> #include <QMouseEvent> #include <QStyle> class MatrixButton : public QPushButton { Q_OBJECT Q_PROPERTY(bool _rightClicked READ wasRightClicked WRITE changeState) public: explicit MatrixButton(QWidget * parent = 0) : QPushButton(parent){} ~MatrixButton(){} bool wasRightClicked(){return _rightClicked;} public slots: void changeState(bool b) { _rightClicked = b; style()->unpolish(this); style()->polish(this); } signals: void rightClicked(); protected: virtual void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE { if(e->button() == Qt::RightButton) { emit rightClicked(); changeState(true); } else { changeState(false); } QPushButton::mousePressEvent(e); } private: bool _rightClicked = false; }; #endif // MATRIXBUTTON_H