gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:55 27 4
gpt4 key购买 nike

我有一些带有输入字段的表单,当字段失去焦点时(当然如果出现问题)会向用户发出警告。为此,我创建了自己的继承自 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com