QLabel click事件是否使用Qt?
我是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
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
的文件,并查看实现(定义)ofvoid 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()
插槽即可。无需传递指针。