• 6360阅读
  • 4回复

[讨论]求助:qt程序eventFilter函数中为什么无法执行close关闭当前窗口 [复制链接]

上一主题 下一主题
离线modelsim
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-29
求助:qt程序eventFilter函数中为什么无法执行close关闭当前窗口
关键词: 关闭当前窗口
自定义类
class jdcompany : public QDialog
{
    Q_OBJECT
public:
    jdcompany( QWidget* parent = 0, const char* name = 0, bool modal = false, WFlags fl = (Qt::WStyle_Customize|Qt::WStyle_NoBorder|Qt::WDestructiveClose));
    ~jdcompany();
public:
    QScrollView *view1;
    QWidget* widget1;
    QMultiLineEdit * edit1;
protected:
    virtual bool eventFilter(QObject *target, QEvent *event);
public slots:
    virtual void jdscrollviewup();
    virtual void jdscrollviewdown();
signals:
    void sig_uppage();
    void sig_downpage();
};
以下是类的实现函数
jdcompany::jdcompany( QWidget* parent, const char* name, bool modal, WFlags fl)
        : QDialog( parent, name, modal, fl )
{
    resize( 320, 240 );
    setMinimumSize( QSize( 320, 240 ) );
    setMaximumSize( QSize( 320, 240 ) );
    setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, sizePolicy().hasHeightForWidth() ) );

    view1 = new QScrollView(this);
    CHECK_PTR( view1 );
    view1->setGeometry(0,0,320,240);
    view1->setHScrollBarMode(QScrollView::AlwaysOff);
    view1->setVScrollBarMode(QScrollView::AlwaysOn);

    widget1 = new QWidget(this);
    CHECK_PTR(widget1 );
    widget1->resize(320,400);

    edit1 = new QMultiLineEdit(widget1);
    CHECK_PTR(edit1 );
    edit1->setGeometry(0,0,320,400);
    edit1->setReadOnly ( true );
    edit1->setEdited ( false );
    edit1->setWordWrap( QMultiLineEdit::WidgetWidth );
    edit1->setWrapPolicy( QMultiLineEdit::Anywhere );
    edit1->setText(QString :: fromUtf8("测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程     序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序1测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序测试程序2"));
    view1->addChild(widget1);

    showFullScreen();
    view1->installEventFilter(this);
    edit1->installEventFilter(this);


    connect(this,SIGNAL(sig_uppage()),this,SLOT(jdscrollviewup()));
    connect(this,SIGNAL(sig_downpage()),this,SLOT(jdscrollviewdown()));
}

jdcompany::~jdcompany()
{
    delete edit1;
    delete widget1;
    delete view1;
}

void jdcompany::jdscrollviewdown()
{    
    view1->scrollBy (0, 160);
}

void jdcompany::jdscrollviewup()
{    
    view1->scrollBy (0, -160);
}

bool jdcompany::eventFilter(QObject *target, QEvent *event)
{
        if(event->type() == QEvent::KeyPress)
        {
             QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
             switch( keyEvent->key() )
              {
                    case Qt::Key_Enter:
                                printf("Key_Enter\n");
                                close();
                                printf("close();\n");
                                update();
                                keypressflag = 0;
                                return true;
                    case Qt::Key_Left:
                               printf("Key_Left\n");
                               close();
                               printf("close();\n");
                               update();
                               keypressflag = 0;
                               return true;
                   case Qt::Key_Up:
                               emit sig_uppage();
                               printf("sig_uppage();\n");
                               keypressflag = 0;
                               return true;
                  case Qt::Key_Right:
                               return true;
                  case Qt::Key_Down:
                              emit sig_downpage();
                              printf("sig_downpage();\n");
                              keypressflag = 0;
                              return true;
                  default:
                              return QDialog::eventFilter(target, event);
                              break;
              }
        }
       return QDialog::eventFilter(target, event);
}
以上程序可以实现带滚动条的文字显示窗口,也可以实现翻页(case Qt::Key_Up:和case Qt::Key_Down:能正常执行),我想实现当按下Key_Enter或Key_Left时关闭当前带滚动条的文字显示窗口,回到其父窗口,通过打印跟踪,printf("Key_Enter\n")和printf("Key_Left\n")都执行了(按键捕获到了)但两个case中的printf("close();\n")都未执行,无法关闭当前窗口回到父窗口,请问朋友们,错在哪里?怎么解决这个问题?不胜感激!我的编译环境是fedora9、Qtopia2.2.0,最终是在2440上运行测试的







离线passion_wu
只看该作者 1楼 发表于: 2012-08-30
pc上测试都没问题啊,不过发现那个Key_Enter是小键盘上的enter,笔记本上一般没有。Key_Return才是一般的回车键。不知道为什么Qtopia2.2.0就不行,你先试试hide函数行不行。
离线modelsim

只看该作者 2楼 发表于: 2012-08-30
回 1楼(passion_wu) 的帖子
非常感谢,我上班的时候试一下,看看什么情况,能否把您pc机上的测试程序发一份上来,我也试试看
离线modelsim

只看该作者 3楼 发表于: 2012-08-30
passion_wu,太感谢你了,用hide();替换掉close();解决了这个问题,但我还是不知道close();为什么不行
离线passion_wu
只看该作者 4楼 发表于: 2012-08-30
pc机上的程序就是用你的程序编的啊,只不过我改了些pc上没有的类,比如QScrollView改成QScrollArea。
其实我看到源代码,pc机上close函数并不会释放内存,这个函数只是把窗口隐藏起来了,除非设置了Qt::WA_DeleteOnClose.
而Qtopia2.2.0版本Qt库的close函数我就不知道了,建议你看看这个版本的close函数做了什么操作。
快速回复
限100 字节
 
上一个 下一个