Nic*_*las 5 qt signals-slots qlabel
我是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)));
Run Code Online (Sandbox Code Playgroud)
一种无需任何子类化即可实现此目的的简单方法是使用信号源来监视某个对象上的事件并发出相关信号:
// 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);
}
};
Run Code Online (Sandbox Code Playgroud)
该emit
关键字是一个空的宏,Qt的定义,如下所示:
#define emit
Run Code Online (Sandbox Code Playgroud)
它仅供人类用作文档辅助前缀,编译器并moc
忽略它。作为文档辅助,这意味着:以下方法调用是一个信号发射。信号只是为您生成实现的方法moc
- 这就是为什么我们必须在#include "main.moc"
下面包含moc
为该文件中的对象类生成的所有实现。除此之外,信号没有什么特别或神奇的地方。在此示例中,您可以在 build 文件夹中查找名为的文件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"
Run Code Online (Sandbox Code Playgroud)
您需要创建一个自定义标签类,该类将继承QLabel
. 然后,您可以使用MouseButtonRelease
事件来检查 Label 的点击和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
};
Run Code Online (Sandbox Code Playgroud)
在您的.cpp
文件中,您的构造函数将连接信号和槽,如下所示:
YourLabelClass :: YourLabelClass(QWidget* parent) : QLabel(parent) {
connect(this, SIGNAL(myLabelClicked()), this, SLOT(slotLabelClicked()));
}
Run Code Online (Sandbox Code Playgroud)
剩下的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";
}
Run Code Online (Sandbox Code Playgroud)
要更改 上的文本QLineEdit
,您需要创建一个自定义类并与自定义QLabel
类共享对象指针。请在此链接检查测试代码