2015-08-14 2 views
4

Я новичок в Qt и задаюсь вопросом.Qt QLabel click event

QLabel У меня есть и QLineEdit объектов, и когда QLabel текста щелкнуло, я хочу, чтобы установить этот текст в QLineEdit.

Также я прочитал, что QLabel не нажал на сигнал.

Можете ли вы объяснить, как я могу это сделать и написать код для меня?!

+0

вы должны создать подкласс QLabel: смотрите здесь https://wiki.qt.io/Clickable_QLabel – gengisdave

+0

я бы испускать сигнал на ' mouseReleaseEvent', а не 'mousePressEvent'. Щелчок не завершен до тех пор, пока мышь не будет отпущена. – Bowdzone

ответ

0

Вам необходимо создать один класс пользовательских меток, который наследует QLabel. Затем вы можете использовать событие MouseButtonRelease, чтобы проверить щелчок на ярлыке и emit свой собственный сигнал и поймать в одном SLOT.

Ваш файл .h будет, как показано ниже:

class YourLabelClass : public QLabel{ 

signals: 
    void myLabelClicked();  // Signal to emit 

public slots: 
    void slotLabelClicked(); // Slot which will consume signal 

protected: 
    bool event(QEvent *myEvent); // This method will give all kind of events on Label Widget  
}; 

В файле .cpp, ваш конструктор будет подключить сигнал & слот, как показано ниже:

YourLabelClass :: YourLabelClass(QWidget* parent) : QLabel(parent) { 
    connect(this, SIGNAL(myLabelClicked()), this, SLOT(slotLabelClicked())); 
} 

Оставшийся event метод и SLOT метод будет реализован как указано ниже:

bool YourLabelClass :: event(QEvent *myEvent) 
{ 
    switch(myEvent->type()) 
    {   
     case(QEvent :: MouseButtonRelease): // Identify Mouse press Event 
     { 
      qDebug() << "Got Mouse Event"; 
      emit myLabelClicked(); 
      break; 
     } 
    } 
    return QWidget::event(myEvent); 
} 

void YourLabelClass :: slotLabelClicked() // Implementation of Slot which will consume signal 
{ 
    qDebug() << "Clicked Label"; 
} 

Для изменения текста на QLineEdit вам необходимо создать пользовательский класс и обмениваться указателем объекта с пользовательским классом QLabel. Пожалуйста, проверьте код теста на this link

+0

Хорошо. Но где код, когда я нажимал на пользовательский текст ярлыка, он устанавливает объект QLineEdit? – Nicholas

+0

@Nicholas: Вам нужно создать объект QLineEdit и поделиться этим указателем с QLable, так или иначе, я сделал быстрый проект. Пожалуйста, проверьте ссылку в ответе –

+0

И один вопрос: зачем нужно излучать сигнал, когда мы можем подключиться с помощью Qt :: connect? Что испускает ключевое слово и когда его использовать? – Nicholas

2

простой способ для достижения этой цели, без необходимости каких-либо подклассов, является источником сигнала, который отслеживает события на какой-либо объект и выдает соответствующие сигналы:

// main.cpp - this is a single-file example 
#include <QtWidgets> 

class MouseButtonSignaler : public QObject { 
    Q_OBJECT 
    bool eventFilter(QObject * obj, QEvent * ev) Q_DECL_OVERRIDE { 
    if ((ev->type() == QEvent::MouseButtonPress 
     || ev->type() == QEvent::MouseButtonRelease 
     || ev->type() == QEvent::MouseButtonDblClick) 
     && obj->isWidgetType()) 
     emit mouseButtonEvent(static_cast<QWidget*>(obj), 
          static_cast<QMouseEvent*>(ev)); 
    return false; 
    } 
public: 
    Q_SIGNAL void mouseButtonEvent(QWidget *, QMouseEvent *); 
    MouseButtonSignaler(QObject * parent = 0) : QObject(parent) {} 
    void installOn(QWidget * widget) { 
    widget->installEventFilter(this); 
    } 
}; 

emit ключевое слово является пустой макрос, Qt определяет его следующим образом:

#define emit 

Он предназначен для использования людьми в качестве префикса документации помощи только компилятор и moc игнорировать его. В качестве документационного обеспечения это означает: следующий вызов метода - это излучение сигнала. Сигналы - это просто методы, реализация которых сгенерирована для вас moc - вот почему мы должны указать #include "main.moc" ниже, чтобы включить все реализации, которые moc сгенерировал для класса (-ов) объекта в этом файле. В противном случае нет ничего особенного или магического сигнала. В этом примере вы можете посмотреть в папке сборки файл с именем main.moc и посмотреть реализацию (определение) void MouseButtonSignaler::mouseButtonEvent(..).

Вы можете установить такой сигнализатор на любом количестве виджетов, такие как QLabel:

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    MouseButtonSignaler signaler; 
    QWidget w; 
    QVBoxLayout layout(&w); 
    QLabel label("text"); 
    QLineEdit edit; 
    layout.addWidget(&label); 
    layout.addWidget(&edit); 
    signaler.installOn(&label); 
    QObject::connect(&signaler, &MouseButtonSignaler::mouseButtonEvent, 
    [&label, &edit](QWidget*, QMouseEvent * event) { 
    if (event->type() == QEvent::MouseButtonPress) 
     edit.setText(label.text()); 
    }); 
    w.show(); 
    return app.exec(); 
} 

#include "main.moc" 
5

Либо стиль другого типа QWidget, такие как специфический QPushButton выглядеть как QLabel и использовать его щелкнули () или наследовать QLabel самостоятельно и испускать свой собственный щелчок().

Смотрите этот пример: https://wiki.qt.io/Clickable_QLabel

Если вы выбрали последний вариант, вы можете передать текст в сигнале. Затем подключить необходимые сигналы/слоты до между QLabel и QLineEdit так:

QObject::connect(&label, SIGNAL(clicked(const QString& text)), 
       &lineEdit, SLOT(setText(const QString& text)));