2013-03-27 5 views
5

मैं एक मिनीसेपर गेम के लिए एक gui बनाने के लिए क्यूटी निर्माता का उपयोग कर रहा हूं। मैं क्यूपश बटन को राइटक्लिक के साथ कैसे क्लिक कर सकता हूं? खेल में झंडा के लिए। दूसरे शब्द में, कौन सा संकेत दाएं क्लिक के लिए उपयोग किया जाता है?क्यूटी दाएं क्लिक करें QPushButton

+0

आपको शायद 'ईवेंट() 'को ओवरराइड करने और सिग्नल को उत्सर्जित करने की आवश्यकता होगी। – rainer

+0

किसी भी प्रश्न के लिए 1 क्यों ?? हां, और अधिक प्रयास हो सकते थे, लेकिन सवाल एक अच्छा है। एक अच्छे जवाब के लिए मुहम्मद को धन्यवाद। – zeFree

उत्तर

16

माउसPressEvent स्लॉट पर फ़िल्टर के साथ अपना स्वयं का बटन बनाएं।

qrightclickbutton.h

#ifndef QRIGHTCLICKBUTTON_H 
#define QRIGHTCLICKBUTTON_H 

#include <QPushButton> 
#include <QMouseEvent> 

class QRightClickButton : public QPushButton 
{ 
    Q_OBJECT 

public: 
    explicit QRightClickButton(QWidget *parent = 0); 

private slots: 
    void mousePressEvent(QMouseEvent *e); 

signals: 
    void rightClicked(); 

public slots: 

}; 

#endif // QRIGHTCLICKBUTTON_H 

qrightclickbutton.cpp

#include "qrightclickbutton.h" 

QRightClickButton::QRightClickButton(QWidget *parent) : 
    QPushButton(parent) 
{ 
} 

void QRightClickButton::mousePressEvent(QMouseEvent *e) 
{ 
    if(e->button()==Qt::RightButton) 
     emit rightClicked(); 
} 

अब इस

QRightClickButton *button = new QRightClickButton(this); 
ui->gridLayout->addWidget(button); 
connect(button, SIGNAL(rightClicked()), this, SLOT(onRightClicked())); 

तरह कनेक्ट MainWindow.cpp में एक स्लॉट बनाएँ।

void MainWindow::onRightClicked() 
{ 
    qDebug() << "User right clicked me"; 
} 

यह मेरे लिए काम करता है!

class CRightClickEnabler : public QObject 
{ 
public: 
    CRightClickEnabler(QAbstractButton * button): QObject(button), _button(button) { 
     button->installEventFilter(this); 
    }; 

protected: 
    inline bool eventFilter(QObject *watched, QEvent *event) override { 
     if (event->type() == QEvent::MouseButtonPress) 
     { 
      auto mouseEvent = (QMouseEvent*)event; 
      if (mouseEvent->button() == Qt::RightButton) 
       _button->click(); 
     } 
     return false; 
    } 

private: 
    QAbstractButton* _button; 
}; 

उपयोग::

connect(ui->pushButton, &QPushButton::clicked, [](){qDebug() << "Button clicked";}); 
new CRightClickEnabler(ui->pushButton); 

अब से, clicked संकेत होगा

+0

यदि कोई भी सामान्य क्लिक() सिग्नल और कस्टम दाएं क्लिक() सिग्नल और कस्टम दोनों को कनेक्ट करना चाहते हैं() सिग्नल - ओवरराइड 'mousePressEvent (QMouseEvent * e के अंत में 'QPushButton :: mousePressEvent (e);' को कॉल करना आवश्यक है।) ' – Krzysiek

5

मुझे लगता है कि QPushButton को केवल बाएं माउस क्लिक सुनने के लिए आंतरिक रूप से लागू किया गया है। लेकिन आप आसानी से QPushButton का विस्तार कर सकते हैं और फिर से कार्यान्वित कर सकते हैं चलो माउस रिलीज इवेंट कहें और सही माउस बटन दबाए जाने पर अपनी बात करें, उदा। उदाहरण के लिए एक कस्टम rightClicked() संकेत फेंकना:

signals: 
    void rightClicked(); 

protected: 
    void mouseReleaseEvent(QMouseEvent *e) { 
     if (e->button() == Qt::RightButton) emit rightClicked(); 
     else if (e->button() == Qt::LeftButton) emit clicked(); 
    } 

... या आपके द्वारा क्लिक संकेत है कि MouseEvent सूचक अग्रेषित करता है ताकि आप बटन के बाहर उसी की जांच कर सकते हैं की एक अधिभार बना सकते हैं।

signals: 
    void clicked(QMouseEvent *); 

protected: 
    void mouseReleaseEvent(QMouseEvent *e) { 
     emit clicked(e); 
    } 

तो फिर तुम स्लॉट आप के लिए बटन के clicked(QMouseEvent *) संकेत कनेक्ट और उसके अनुसार आगे बढ़ना में जांच करते हैं।

+0

मैं 'QPushButton' का उपयोग कर रहा हूं और उसमें कोई 'बटन()' नहीं है। मुझे क्या करना चाहिए? – KhoC

+0

@KhoC क्या ?? 'बटन()' 'QMouseEvent' का एक तरीका है। – cmannett85

+0

इसलिए मुझे नहीं पता कि मैं 'mouseReleaseEvent' का उपयोग कैसे कर सकता हूं। आप 'mouseReleaseEvent' में 'rightClicked()' क्यों कहते हैं? – KhoC

2

मैं सिर्फ यह उपवर्ग करने की कोई जरूरत के साथ किसी भी मौजूदा बटन पर राइट-क्लिक करने योग्य बनाने के लिए इस छोटे सहायक एडाप्टर लिखा था राइट क्लिक के साथ-साथ बाएं क्लिक से ट्रिगर करें। इस ऑब्जेक्ट को हटाने की कोई आवश्यकता नहीं है - यह माता-पिता के रूप में ui->pushButton का उपयोग करता है और माता-पिता को नष्ट होने पर क्यूटी द्वारा स्वतः हटा दिया जाएगा।

जाहिर है, आप यहां एक नया सिग्नल घोषित करने के लिए कोड की 2 पंक्तियां (शाब्दिक रूप से) लिख सकते हैं और वांछित होने पर clicked के बजाय दायाँ क्लिक पर सिग्नल छोड़ सकते हैं।

संबंधित मुद्दे