首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

做了4年的编程,没有见过这么诡异的事情 求骨灰级大神

2014-01-09 
做了4年的编程,没见过这么诡异的事情 求骨灰级大神要做的东西很简单:就是当用户用鼠标左键单击主窗口上的

做了4年的编程,没见过这么诡异的事情 求骨灰级大神
要做的东西很简单:就是当用户用鼠标左键单击主窗口上的一个graphicsview时,弹出一个dialog窗口

我的实现方法:
写一个class GraphicsViewDessin 继承QGraphicsView
重写mousePressEvent函数 在这个函数里emit一个信号
代码:
class GraphicsViewDessin : public QGraphicsView
{
    Q_OBJECT

public:
    GraphicsViewDessin(QWidget *parent = 0);

protected:
    void mousePressEvent(QMouseEvent *);

signals:
    void dessin_by_click();
};

GraphicsViewDessin::GraphicsViewDessin(QWidget *parent) : QGraphicsView(parent)
{
}

void GraphicsViewDessin::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        emit dessin_by_click();
    }
}


在主窗口的函数中,将上面的信号和一个slot连起来:(主窗口上的graphicsview叫graphicsview_extra)
connect(ui->graphicsView_extra, SIGNAL(dessin_by_click()), this, SLOT(on_graphicsview_extra_clicked()));
这个slot如下:
void MainWindow::on_graphicsview_extra_clicked()
{
    QDialog d(this);
    d.exec();
}


运行程序后,当我点击主窗口上的那个graphicsview_extra时,则弹出一个Dialog,这没问题
问题是:
如果我此时点击Dialog右上角的红叉关掉它后,不论我在主窗口的哪里点击鼠标左键,都会再次打开一个Dialog
而如果我重写一个class去继承QDialog 然后在上面放一个按钮,然后把上面的slot换成启动这个我定义的Dialog,我仍然会遇到同样的问题~~~但是如果我在关闭它之前点击一下它上面的按钮,即使按钮什么事情也不做,这个问题就消失了....一切都变得正常了.....
而如果我切入到调试模式,我在上面的slot里面的d.exec()前面放一个断点,然后运行程序,当我第一次点击graphicsview_extra时,到断点停了,我点击继续,dialog弹出,然后我关闭它~~而后我在主窗口任意处点击左键,则又会运行到断点,然后我再点继续,dialog又弹出,我再关闭它,然后就一切有正常了..........也就是说,如果我调试的话,第一次通过点击graphicsview_extra启动后,只会出现一次这个问题...(而如果是直接运行,就会出现无数次,即,我在第一次正常点击graphicsview_extra后,不论我点击多少次主窗口的任意处,都会弹出dialog)

而如果我把上面的slot改掉,改成做其他事情---只要不是运行dialog,那么一切正常...


这个问题我想了两天了,没搞明白怎么回事......


求大神啊!~~~
[解决办法]

引用:
Quote: 引用:

重载mousePressEvent()函数的时候,最好处理完自己的消息后,调用父方法:
void GraphicsViewDessin::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        emit dessin_by_click();
    }
    QGraphicsView::mousePressEvent( event );// 新增
}

另外,在调试状态下,可以使用这个方法获得更多信息:
QObject* pSender = sender( );// 新增
QDialog d(this);
d.exec();

然后调试时,监视pSender变量,看看其是否为ui->graphicsView_extra。


我现在去试试   我之前试过把父方法写上  没用

写上父方法是好习惯。因为你不可能不要这个类其它的功能接收不了事件吧?还有如果确定自己要处理这个事件,不让父类处理,那么在emit之后写上event->accept(),再返回。

热点排行