0

大きな疑問と問題があります。多くのチュートリアルと例を試した後、QLabel で信号クリックを受信できません。同じことを QDialog (QLabel ではなく) で行うと、マウスの状態を知ることができます。

サンプル コードを貼り付けます。その前に、プロジェクトを作成する手順を示します。

プロジェクトを作成し、QMainWindow (名前は testWindow、グラフィカルに作成) を作成します。その後、QLabel (lblMouse) を追加し、mouseTracking プロパティを true としてマークします。実行後、QLabel lblMouse がマウス イベントに反応しません。

別の疑問は次のとおりです。私のプログラムを実行した後、私のQLabelのテキストは、コンストラクターで割り当てたときに「Hello」ではありません.uiが実行された後に実行されますか? ui->lblMouse->setText("Hello"); を使用して、UI のコンストラクターから変更できます。(おそらくエラーがあります。私は 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: No such signal QLabel::Mouse_Left() in ../testwindow.cpp:17
  • QObject::connect: (送信者名: 'lblMouse')
  • QObject::connect: (レシーバー名: 'testWindow')

PD: それが問題かどうかはわかりません。これを行う他の方法をテストしましたが、良い結果が得られませんでした。

ありがとう!

4

2 に答える 2

1

ui のラベルは QLabel クラスですが、lblMouseを作成しました。したがって、UI ではコードを変更する必要があります

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

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

編集:

これを変更するには、次のことができます。

  1. 任意のテキスト エディターを使用します。
  2. ui を選択して Qt Creator の Designer に移動し、QLabelコンテキスト メニューを呼び出して [ Promote to... ] をクリックします。次に、「基本クラス名」が正しいことを確認しQLabel( lblMouse)、「昇格クラス名」フィールドにクラスを入力し ( )、「追加」ボタンをクリックしてから、「昇格」ボタンをクリックします。それで全部です。あなたのラベルはあなた自身のラベルクラスになりました。

方法についてsetText()

  1. デザイナーに移動します。
  2. ラベルを選択してください。
  3. オブジェクトのプロパティの右側で領域を見つけ、「 text」プロパティQLabelの丸い矢印の前をクリックします。それで全部です。ここで、コンストラクターでメソッドを実行すると、動作します。setText()
于 2016-05-11T07:21:34.857 に答える
0

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()));
于 2016-05-11T07:58:25.647 に答える