在Qt窗口小部件应用程序中,在QSpinBox
的{{1}}超载的情况下,我无法在setValue
之后更改paintEvent
的值。
感谢@eyllanesc,我将强调这个问题。
我的问题是:为什么在MainWindow
的{{1}}中,QSpinBox
在setValue
超载后不能更改其值?
我可以按照以下步骤重现该问题。
paintEvent
将以下代码添加到MainWindow
中:
QSpinBox
将以下代码添加到mainwindow.h
中:
void paintEvent(QPaintEvent *);
我可以将函数mainwindow.cpp
移到另一个地方来避免此问题,但是为什么会发生这种情况?我找不到我犯的错误。
void MainWindow::paintEvent(QPaintEvent *) { ui->spinBox->setValue(2); }
和setValue
,它们的行为类似。QDoubleSpinBox
,它不起作用。QLineEdit
发出信号,但setReadOnly(false)
不再起作用。valueChanged(int)
和setValue(int)
的内容。我找不到有用的东西。请帮助我!
完整的源代码可以在mainwindow.h,main.cpp,mainwindow.cpp,mainwindow.ui中找到。
答案 0 :(得分:5)
如果在paintEvent方法中进行了更改,为什么不能更改QSpinBox的值?
因为要在应用程序的异步部分中创建无限循环。
当更新任何GUI值以便用户可以看到它时,则必须对其重新粉刷,为此开发人员调用update()
,该方法在内部发送事件QEvent::Paint
,在这种情况下这些事件会从父级到子级发送到所有小部件,在这种情况下,QEvent::Paint
事件首先到达MainWindow,然后可能到达您孩子的Spinbox。如果父母使用它,则仅将其传递给孩子。然后顺序如下:
QSpinbox
update()
QEvent::Paint
事件被发送到窗口,并将其重新分配给子窗口。最后,如果更改了Spinbox的值,它将间接调用MainWindow的paintEvent方法并将Spinbox设置为先前的值。 paintEvent(...)的任务只是绘画,而不是更新另一个值,如果这样做,则可能会创建一个无限循环。