Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QLabel click事件是否使用Qt?_Qt_Signals Slots_Qlabel - Fatal编程技术网

QLabel click事件是否使用Qt?

QLabel click事件是否使用Qt?,qt,signals-slots,qlabel,Qt,Signals Slots,Qlabel,我是Qt新手,有个问题 我有QLabel和QLineEdit对象,当单击QLabel文本时,我想在QLineEdit中设置此文本 我还读到QLabel没有点击信号 你能解释一下我怎么做并为我写代码吗 您需要创建一个自定义标签类,它将继承QLabel。然后,您可以使用MouseButtonRelease事件来检查标签的点击,并发出您的自定义信号,并在一个插槽中捕捉 您的.h文件如下: class YourLabelClass : public QLabel{ signals: void

我是Qt新手,有个问题

我有
QLabel
QLineEdit
对象,当单击
QLabel
文本时,我想在
QLineEdit
中设置此文本

我还读到
QLabel
没有点击信号


你能解释一下我怎么做并为我写代码吗

您需要创建一个自定义标签类,它将继承
QLabel
。然后,您可以使用
MouseButtonRelease
事件来检查标签的点击,并
发出您的自定义信号,并在一个
插槽中捕捉

您的
.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    
};
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";
}
.cpp
文件中,构造函数将连接信号和插槽,如下所示:

YourLabelClass :: YourLabelClass(QWidget* parent) : QLabel(parent) {
   connect(this, SIGNAL(myLabelClicked()), this, SLOT(slotLabelClicked()));
}
剩余的
事件
方法和
时隙
方法将按如下方式实施:

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    
};
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";
}
boolYourLabelClass::事件(QEvent*myEvent)
{
开关(myEvent->type())
{        
案例(QEvent::MouseButtonRelease)://标识鼠标按下事件
{

qDebug()实现这一点的一个简单方法是,不需要任何子类,它是一个信号源,用于监视某个对象上的事件并发出相关信号:

// 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);
  }
};
它仅供人类作为文档辅助前缀使用,编译器和
moc
忽略它。作为文档辅助,它意味着:下面的方法调用是一个信号发射。信号只是方法,其实现由
moc
为您生成-这就是为什么我们必须
包括“main.moc”
以包括
moc
为此文件中的对象类生成的所有实现。除此之外,信号没有任何特殊或神奇之处。在本例中,您可以在生成文件夹中查找名为
main.moc
的文件,并查看实现(定义)of
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"

可以将另一种类型的QWidget(例如特定的QPushButton)设置为类似QLabel并使用其clicked()信号,也可以自己继承QLabel并发出自己的clicked()信号

请参见此示例:

如果选择后一个选项,则可以在信号中传递文本。然后在QLabel和QLineEdit之间连接必要的信号/插槽,如下所示:

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

您必须将QLabel子类化:看这里,我将在
mouseReleaseEvent
上发出信号,而不是在
MousePresseEvent
上发出信号。直到释放鼠标,点击才算完成。一些随机想法,因为我在LCD触摸屏和点击事件方面也有类似的问题……使用QButton可能比使用QLabel更容易因为按钮已经知道点击/点击事件。请将按钮设置为无边框的平面或2D。然后,像往常一样处理按钮的点击/点击事件。确定。但代码在哪里?当我点击自定义创建的标签文本时,它设置为QLineEdit对象?@Nicholas:您需要创建QLineEdit对象并与QLable共享该指针,无论如何,我做了一个quick项目。请检查答案中的链接,并回答一个问题:为什么需要发射信号,何时可以使用Qt::connect进行连接?发射关键字是什么以及何时使用?此链接将解释信号和插槽:如果您使用
myLabelClicked()
通过信号传递
QString
参数,该参数只需连接到
QLineEdit
setText()
插槽即可。无需传递指针。