2011-01-21 64 views
1

我有一些输入字段在字段失去焦点时向用户提供警告(如果有错误当然是)。为此,我创建了自己的控件,它继承自QLineEdit。对于这个问题,考虑一个非常简单的字段,当控件中有文本时,如果焦点丢失,它将弹出一个消息框。实际的控制有更多的逻辑,但是都应该弹出一个消息框。 (Crossposted到qtcentre.org)当焦点转移到按钮被中断时,QPushButton被卡住的绘图被按下

class test_line_edit : public QLineEdit 
{ 
    Q_OBJECT 

public: 
    test_line_edit(QWidget * parent = 0) : QLineEdit(parent) 
    {} 

    ~test_line_edit(){} 

protected: 
    virtual void focusOutEvent(QFocusEvent * e) 
    { 
    if(!text().isEmpty()) 
    { 
     QMessageBox msg; 
     msg.setText(tr("Test")); 
     msg.exec(); 
     setFocus(Qt::OtherFocusReason); 
    } 
    else 
    { 
     QLineEdit::focusOutEvent(e); 
    } 
    } 

}; 

现在说我有一个简单的形式与这些控件和一个QPushButton的只有一个。如果用户键入控件,然后单击该按钮,则弹出消息框,但该按钮被卡住,看起来像按下了按钮。我怎样才能做到这一点?尽我所能地告诉QPushButton的按下的信号被解雇了,但这是我能从按钮上听到的所有信息。由于这些test_line_edit控件将在许多不同形式的任何地方使用,我希望我可以在test_line_edit类中修改这个问题。 http://bugreports.qt-project.org/browse/QTBUG-7901

:使用Visual Studio 2010

我已经看到了这个错误,不知道它,因为它是一个不同的平台的相关的,我不竟按住该按钮,在Windows XP上运行的Qt 4.7.0以下是一个演示问题的一个完整的程序(警告:从Qt的VS插件生成一些代码)

main.h:

#include <QtGui/QMainWindow> 

#include <QtCore/QVariant> 
#include <QtGui/QAction> 
#include <QtGui/QApplication> 
#include <QtGui/QButtonGroup> 
#include <QtGui/QHeaderView> 
#include <QtGui/QMainWindow> 
#include <QtGui/QMenuBar> 
#include <QtGui/QPushButton> 
#include <QtGui/QStatusBar> 
#include <QtGui/QToolBar> 
#include <QtGui/QVBoxLayout> 
#include <QtGui/QWidget> 

#include <QLineEdit> 
#include <QMessageBox> 

class test_line_edit : public QLineEdit 
{ 
    Q_OBJECT 

public: 
    test_line_edit(QWidget * parent = 0) : QLineEdit(parent) 
    {} 

    ~test_line_edit(){} 

protected: 
    virtual void focusOutEvent(QFocusEvent * e) 
    { 
    if(!text().isEmpty()) 
    { 
     QMessageBox msg; 
     msg.setText(tr("Test")); 
     msg.exec(); 
     //setFocus(Qt::OtherFocusReason); 
    } 
    else 
    { 
     QLineEdit::focusOutEvent(e); 
    } 

    QLineEdit::focusOutEvent(e); 
    } 

}; 

QT_BEGIN_NAMESPACE 

class Ui_btn_drawing_testClass 
{ 
public: 
    QWidget *centralWidget; 
    QVBoxLayout *verticalLayout; 
    test_line_edit *line_edit; 
    QPushButton *btn; 
    QMenuBar *menuBar; 
    QToolBar *mainToolBar; 
    QStatusBar *statusBar; 

    void setupUi(QMainWindow *btn_drawing_testClass) 
    { 
     if (btn_drawing_testClass->objectName().isEmpty()) 
      btn_drawing_testClass->setObjectName(QString::fromUtf8("btn_drawing_testClass")); 
     btn_drawing_testClass->resize(167, 127); 
     centralWidget = new QWidget(btn_drawing_testClass); 
     centralWidget->setObjectName(QString::fromUtf8("centralWidget")); 
     verticalLayout = new QVBoxLayout(centralWidget); 
     verticalLayout->setSpacing(6); 
     verticalLayout->setContentsMargins(11, 11, 11, 11); 
     verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); 
     line_edit = new test_line_edit(centralWidget); 
     line_edit->setObjectName(QString::fromUtf8("line_edit")); 

     verticalLayout->addWidget(line_edit); 

     btn = new QPushButton(centralWidget); 
     btn->setObjectName(QString::fromUtf8("btn")); 

     verticalLayout->addWidget(btn); 

     btn_drawing_testClass->setCentralWidget(centralWidget); 
     menuBar = new QMenuBar(btn_drawing_testClass); 
     menuBar->setObjectName(QString::fromUtf8("menuBar")); 
     menuBar->setGeometry(QRect(0, 0, 167, 20)); 
     btn_drawing_testClass->setMenuBar(menuBar); 
     mainToolBar = new QToolBar(btn_drawing_testClass); 
     mainToolBar->setObjectName(QString::fromUtf8("mainToolBar")); 
     btn_drawing_testClass->addToolBar(Qt::TopToolBarArea, mainToolBar); 
     statusBar = new QStatusBar(btn_drawing_testClass); 
     statusBar->setObjectName(QString::fromUtf8("statusBar")); 
     btn_drawing_testClass->setStatusBar(statusBar); 

     retranslateUi(btn_drawing_testClass); 

     QMetaObject::connectSlotsByName(btn_drawing_testClass); 
    } // setupUi 

    void retranslateUi(QMainWindow *btn_drawing_testClass) 
    { 
     btn_drawing_testClass->setWindowTitle(QApplication::translate("btn_drawing_testClass", "btn_drawing_test", 0, QApplication::UnicodeUTF8)); 
     btn->setText(QApplication::translate("btn_drawing_testClass", "PushButton", 0, QApplication::UnicodeUTF8)); 
    } // retranslateUi 

}; 

namespace Ui { 
    class btn_drawing_testClass: public Ui_btn_drawing_testClass {}; 
} // namespace Ui 

QT_END_NAMESPACE 

class btn_drawing_test : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    btn_drawing_test(QWidget *parent = 0, Qt::WFlags flags = 0): QMainWindow(parent, flags) 
    { 
    ui.setupUi(this); 
    } 
    ~btn_drawing_test(){} 

private: 
    Ui::btn_drawing_testClass ui; 

protected slots: 
    void on_btn_clicked() 
    { 
    int breakpoint = 5; 
    } 
    void on_btn_pressed() 
    { 
    int breakpoint = 5; 
    }  
    void on_btn_toggled(bool) 
    { 
    int breakpoint = 5; 
    } 
}; 

main.cpp中:

#include <QtGui/QApplication> 
#include "main.h" 



int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    btn_drawing_test w; 
    w.show(); 
    return a.exec(); 
} 

感谢您的帮助,请让我知道,如果我可以提供任何更多的信息。

回答

0

我做了一些更改行编辑类,看看它是否解决了这个问题:

class test_line_edit : public QLineEdit 
{ 
    Q_OBJECT 

public: 
    test_line_edit(QWidget * parent = 0) : QLineEdit(parent) {} 
    ~test_line_edit(){} 

protected: 
    virtual void focusOutEvent(QFocusEvent * e) 
    { 
     QLineEdit::focusOutEvent(e); 
     QEvent *event = new QEvent(QEvent::User); 
     QApplication::postEvent(this, event); 
    } 

    virtual void customEvent(QEvent * event) 
    { 
     QLineEdit::customEvent(event); 
     if (event->type()==QEvent::User) 
     { 
      QMessageBox msg; 
      msg.setText(tr("Test")); 
      msg.exec(); 
      setFocus(Qt::OtherFocusReason); 
     } 
    } 
}; 

而不是显示在focusOutEvent方法模态窗口,我已经posted an event到事件队列。这工作得很好,在我的Ubuntu上,不要指望Windows上有任何问题。

希望这会有所帮助,关心

+0

工程就像一个魅力,并做我正在寻找的东西。感谢您的帮助。 – 2011-01-25 21:55:49