Qt C ++ QLabel Clickable события мыши не работают

У меня есть большие сомнения и проблемы. После многих уроков и примеров я не могу получить сигнал щелчка в моем QLabel. Если я делаю то же самое, но в QDialog (не в QLabel), я могу знать состояние мыши.

Я вставляю свой пример кода, перед этим я представляю свои шаги для создания проекта:

Я делаю проект, создаю QMainWindow (с именем testWindow, отображается графически), после этого я добавляю QLabel (lblMouse), отмечаю свойство mouseTracking как true. После выполнения мой QLabel lblMouse не реагирует на события моей мыши.

Еще одно сомнение: после выполнения моей программы текст моего QLabel не является «Привет», как я назначаю в его конструкторе, он будет выполняться после выполнения пользовательского интерфейса? Я могу изменить его из конструктора пользовательского интерфейса с помощью ui-> lblMouse-> setText («Hello»); (Возможно, у меня ошибка, я программист на C и пытаюсь войти в мир C ++)

После этого я редактирую код (testWindow.cpp и testWindow.h):

Вот мой код cpp:

testWindow::testWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::testWindow)
{
ui->setupUi(this);

//It will not be neccesary because I mark on the checkbox of mouseTracking
ui->lblMouse->setMouseTracking(true);

connect(ui->lblMouse, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(ui->lblMouse, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(ui->lblMouse, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));
}

testWindow::~testWindow()
{
delete ui;
}

void testWindow::Mouse_current_pos()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);
}

void testWindow::Mouse_Pressed()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);

}

void testWindow::Mouse_left()
{
ui->lblMouse_Current_Pos->setText(QString("X = aa, Y = aa")/*.arg(ui->lblMouse->x())*/);

}

lblMouse::lblMouse(QWidget *parent): QLabel(parent)
{
// strange for me, the initial text of the label is not Hello
this->setText("Hello");
}

lblMouse::~lblMouse()
{

}

void lblMouse::mouseMoveEvent(QMouseEvent *ev)
{
this->xpos = ev->x();
this->ypos = ev->y();

emit Mouse_Pos();
}

void lblMouse::mousePressEvent(QMouseEvent *)
{
emit Mouse_Pressed();
//    ev->x();
}

void lblMouse::leaveEvent(QEvent *)
{
emit Mouse_Left();
}

Вот мой файл h:

#ifndef TESTWINDOW_H
#define TESTWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QMouseEvent>

#include <QEvent>
#include <QDebug>

namespace Ui {
class testWindow;
class lblMouse;
}class lblMouse : public QLabel
{
Q_OBJECT
public:
explicit lblMouse(QWidget *parent = 0);
~lblMouse();
int xpos,ypos;
void leaveEvent(QEvent *);

protected:
void mouseMoveEvent(QMouseEvent *ev);
void mousePressEvent(QMouseEvent *ev);

signals:
void Mouse_Pressed();
void Mouse_Pos();
void Mouse_Left();

};class testWindow : public QMainWindow
{
Q_OBJECT

public:
explicit testWindow(QWidget *parent = 0);
~testWindow();

private:
Ui::testWindow *ui;private slots:
void Mouse_current_pos();
void Mouse_Pressed();
void Mouse_left();
};

#endif // TESTWINDOW_H

Кроме того, вот мой файл .ui (спасибо @Thomas):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>testWindow</class>
<widget class="QMainWindow" name="testWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="lblMouse">
<property name="geometry">
<rect>
<x>20</x>
<y>60</y>
<width>331</width>
<height>241</height>
</rect>
</property>
<property name="mouseTracking">
<bool>true</bool>
</property>
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="text">
<string>Mouse Area</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>400</x>
<y>50</y>
<width>201</width>
<height>191</height>
</rect>
</property>
<property name="title">
<string>Mouse Events</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblMouse_Current_Pos">
<property name="frameShape">
<enum>QFrame::Box</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>x=0, Y=0</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblMouse_Current_Event">
<property name="frameShape">
<enum>QFrame::Panel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menuMenu">
<property name="title">
<string>&amp;Menu</string>
</property>
<addaction name="actionImportar"/>
</widget>
<addaction name="menuMenu"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionImportar">
<property name="text">
<string>&amp;Importar...</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>

Редактировать:

Я вижу ошибку во время выполнения в консоли (это не ошибка компиляции, я получил это сообщение после запуска программы, но она продолжает работать):

  • QObject :: connect: такого сигнала нет QLabel :: Mouse_Left () в
    ../testwindow.cpp:17
  • QObject :: connect: (имя отправителя: ‘lblMouse’)
  • QObject :: connect: (имя получателя: ‘testWindow’)

П.Д .: Я не уверен, что это проблема. Я проверил другие способы сделать это, и у меня не очень хорошие результаты.

Спасибо!

0

Решение

Ваша метка в пользовательском интерфейсе — это класс QLabel, но вы создали lblMouse. Итак, в пользовательском интерфейсе вы должны изменить код

<widget class="QLabel" name="lblMouse">

в

<widget class="lblMouse" name="lblMouse">

РЕДАКТИРОВАТЬ:

Чтобы изменить это, вы можете:

  1. Используйте любой текстовый редактор;
  2. Перейдите в Designer в Qt Creator, выбрав ваш пользовательский интерфейс, выберите ваш QLabel, вызовите контекстное меню и нажмите «Повышать до …«. Тогда проверь это»Имя базового класса» верно (QLabel), напиши свой класс (lblMouse) в «Название повышенного класса«поле, нажмите»добавлять«тогда кнопка»содействоватьКнопка. Вот и все. Ваш ярлык теперь ваш собственный класс ярлыков.

Около setText() метод.

  1. Перейти к дизайнеру;
  2. Выберите свой ярлык;
  3. В правой части в объекте собственности найти QLabel область и нажмите на круглую стрелку перед «текст«собственность. Вот и все. Теперь, если вы делаете setText() Метод в конструкторе — это будет работать.
1

Другие решения

Вам просто нужно использовать свой lblMouse учебный класс.

В .h файле добавьте это в класс testWindow

lblMouse *lblMouse_Current_Pos;

В файле .cpp добавьте это в конструктор:

lblMouse_Current_Pos = new lblMouse(this);
lblMouse_Current_Pos->setMouseTracking(true);
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pos()), this, SLOT(Mouse_current_pos()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
connect(lblMouse_Current_Pos, SIGNAL(Mouse_Left()), this, SLOT(Mouse_left()));
0

По вопросам рекламы [email protected]