c++ - 当焦点转移到按钮被中断时,QPushButton 卡住绘图按下

标签 c++ qt qt4

我有一些带有输入字段的表单,当字段失去焦点时(当然如果出现问题)会向用户发出警告。为此,我创建了自己的继承自 QLineEdit 的控件。对于这个问题,考虑一个极其简单的字段,当控件中有文本时,只要失去焦点就会弹出一个消息框。实际的控件有更多的逻辑,但都应该弹出一个消息框。 (交叉发布到 qtcentre.org)

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 类中进行一些更改来解决问题。使用 Visual Studio 2010 在 Windows XP 上运行 Qt 4.7.0。

我看到了这个错误,但不确定它是否相关,因为它是一个不同的平台,而且我实际上并没有按住按钮:http://bugreports.qt-project.org/browse/QTBUG-7901

这是演示问题的完整程序(警告:Qt VS 插件生成的一些代码)

主要.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;
  }
};

主要.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();
}

感谢您的帮助,如果我能提供更多信息,请告诉我。

最佳答案

我对你的行编辑类做了一些修改,看看它是否解决了问题:

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 上也不会出现任何问题。

希望这对你有帮助,问候

关于c++ - 当焦点转移到按钮被中断时,QPushButton 卡住绘图按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763645/

相关文章:

c++ - 如何从传递的数组中正确构造 CUSP coo 矩阵

c++ - 如何为QXmlStreamWriter/Reader序列化QColor、QSize、QPoint

c++ - 从不同线程中的 QFile 读取

c++ - Qt4 + CGAL - "BOOST_JOIN"处的解析错误

python - 我的代码中的不可见对象应如何与其可见的小部件对应项相关?

c++ - 将 qwidget 上的当前项目保存为图像

c++ - 对象作为 CMap 中的键

c++ - 在这种情况下如何使成员函数成为友元函数?

c++ - 使用迭代器的值从 Set 中删除元素

c++ - 如何限制 QHeaderView 的大小(调整部分大小时)?