簡體   English   中英

如何獲得焦點通知?

[英]How to be notified on focus?

該問題已被編輯:

我正在使用QML。

我有一個稱為多邊形的自定義類型,它是QDeclarativeItem的子calss。

我想在鼠標單擊多邊形(具有焦點)時收到通知。

我知道QDeclarativeItem具有功能:focusInEvent。

我在Polygon.cpp中覆蓋它,這里是polygon.cpp

#include "polygon.h"
#include "point.h"
#include <QPainter>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <QGraphicsSceneDragDropEvent>
#include <QFocusEvent>
#include "DeclarativeDragDropEvent.h"

using namespace std;
using namespace Qt;

Polygon::Polygon(QDeclarativeItem *parent)
    : QDeclarativeItem(parent)
{
    // need to disable this flag to draw inside a QDeclarativeItem
    setFlag(QDeclarativeItem::ItemHasNoContents, false);
    setFlags(ItemIsSelectable|ItemIsMovable|ItemIsFocusable);
    setAcceptDrops(true);


}
QVariant Polygon::itemChange(GraphicsItemChange change, const QVariant &value)
{

    return QGraphicsItem::itemChange(change, value);
}


void Polygon::focusInEvent ( QFocusEvent * event ){
    cout<<"focusin"<<endl;
}

QRectF Polygon::boundingRect() const{

    QVector<QPointF> vPnt=listToVector(m_vertices);
    return QPolygonF(vPnt).boundingRect();

}

QPainterPath Polygon::shape () const
{
    QPainterPath path;
    QVector<QPointF> vPnt=listToVector(m_vertices);
    path.addPolygon(QPolygonF(vPnt));
return path;
}

QString Polygon::name() const
{
    return m_name;
}

void Polygon::setName(const QString &name)
{
    m_name = name;
}

QColor Polygon::color() const
{
    return m_color;
}

void Polygon::setColor(const QColor &color)
{
    m_color = color;
}

void Polygon::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
    QPen pen(m_color, 2);
    painter->setPen(pen);
    painter->setRenderHints(QPainter::Antialiasing, true);


QVector<QPointF> vPnt=listToVector(m_vertices);
    painter->setBrush(QBrush(m_color,Qt::SolidPattern));
    painter-> drawPolygon(QPolygonF(vPnt),Qt::OddEvenFill);



}

QVector<QPointF> Polygon:: listToVector(QList<Point *> lpnt) const{
    QVector<QPointF> vPnt;
        for(int i=0;i<lpnt.length();i++){
            vPnt.append(QPointF(lpnt.at(i)->x(),lpnt.at(i)->y()));

        }
        return vPnt;
}

QDeclarativeListProperty<Point> Polygon::vertices()
 {
     return QDeclarativeListProperty<Point>(this, 0, &Polygon::append_vertex);
 }

 void Polygon::append_vertex(QDeclarativeListProperty<Point> *list, Point *vertex)
 {
     Polygon *polygon = qobject_cast<Polygon *>(list->object);
     if (polygon) {
         vertex->setParentItem(polygon);
         polygon->m_vertices.append(vertex);
     }
 }

這是我的qml文件:

import MyTypes 1.0
import QtQuick 1.0
import Qt 4.7

 Item {
     id:container
     width: 300; height: 200

     Polygon {
         id: aPolygon
         anchors.centerIn: parent
         width: 100; height: 100
         name: "A simple polygon"
         color: "blue"
         vertices:[

         Point{x:20.0; y:40.0},
         Point{x:40.0; y:40.0},
         Point{x:40.0; y:20.0},
         Point{x:20.0; y:20.0}
         ]


     }




 }

我覆蓋形狀,boundingRect,如您所見,它定義了Polygon對象,並在單擊時焦點成功顯示在ti中。

但是我看不到屏幕上focusInEvent函數中的cout輸出。

我應該在項目的main.cpp上添加一些內容嗎?

對C ++代碼做什么知道對象具有焦點?

有聯系嗎 感謝您的任何想法。

我嘗試過,看來問題出在輸出“ cout”上,嘗試“ qDebug”看是否有好的代碼。 您所做的一切都是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM