我是Qt新手,有一个问题。
我有QLabel
和QLineEdit
对象,当单击QLabel
文本时,我想在QLineEdit
中设置此文本。
还我已经知道QLabel
尚未点击信号。
您能解释一下我该怎么做并为我编写代码吗?!
可以使用另一种类型的QWidget(例如特定的QPushButton)使其看起来像QLabel并使用其clicked()信号,或者自己继承QLabel并发出自己的clicked()信号。
请参见以下示例:https://wiki.qt.io/Clickable_QLabel
如果选择后者,则可以在信号中传递文本。然后像这样在QLabel和QLineEdit之间连接必要的信号/插槽:
QObject::connect(&label, SIGNAL(clicked(const QString& text)),
&lineEdit, SLOT(setText(const QString& text)));
一种无需任何子类即可实现的简单方法是监视某个对象上的事件并发出相关信号的信号源:
// 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"
您需要创建一个自定义标签类,该类将继承QLabel
。然后,您可以使用MouseButtonRelease
事件来检查标签的单击,然后单击emit
您的自定义信号并捕获一个SLOT
。