我是Qt的新手,有一个问题。
我有QLabel
和QLineEdit
对象,当单击QLabel
文本时,我想将此文本设置在QLineEdit
中。
另外我已经阅读到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)));
// 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"
以包含此文件中对象类别的所有实现的原因。信号本身没有任何特殊或神奇之处。在此示例中,您可以在构建文件夹中查找名为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
中捕获。
您的.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
类共享对象指针。请在此链接中检查测试代码。
mouseReleaseEvent
上发出信号,而不是在mousePressEvent
上。只有当鼠标释放时,点击才算完成。 - Bowdzone