在Qt的Widgets应用程序,我不能改变我的价值QSpinBox后,我setValue在重载它paintEvent的MainWindow.
感谢@eyllanesc,我将强调这个问题.
我的问题是:为什么我不能改变我的价值QSpinBox后,我setValue在重载它paintEvent的MainWindow?
我可以通过以下步骤重现该问题.
QSpinBox嵌入式Qt设计器将以下代码添加到mainwindow.h:
void paintEvent(QPaintEvent *);
将以下代码添加到mainwindow.cpp:
void MainWindow::paintEvent(QPaintEvent *) { ui->spinBox->setValue(2); }
我可以将我的功能setValue移到另一个地方以避免这个问题,但为什么会这样呢?我找不到我犯的错误.
QDoubleSpinBox和QLineEdit,他们的行为类似.setReadOnly(false),它不起作用.valueChanged(int),但setValue(int)不再起作用.QPaintEventQAbstractSpinBox请帮帮我!
完整的源代码可以在mainwindow.h,main.cpp,mainwindow.cpp,mainwindow.ui中找到.
如果在paintEvent方法中进行更改,为什么不能更改QSpinBox的值?
因为您在应用程序的异步部分中创建了一个无限循环.
当任何GUI值更新以便用户可以看到它然后必须重新绘制,并且为此开发人员调用update(),该方法在内部发送事件QEvent::Paint,并且在事件的情况下,这些被发送到从父到子的所有小部件,在这种情况下,QEvent::Paint事件首先到达MainWindow,然后可能到达您孩子的旋转盒.如果父级使用它,它只会传递给子级.然后序列如下:
QSpinboxupdate()QEvent::Paint事件被发送到窗口,并其重新分配给孩子们.总之,如果你改变了spinbox的值,它将间接调用MainWindow的paintEvent方法并将spinbox设置为前一个值.paintEvent(...)的任务只是绘制,而不是更新另一个值,如果它,它可能会创建一个无限循环.