Don';t在Qt中可设置后立即重新喷漆
我在扫雷游戏中使用 从简单模式更改为硬模式后,QPushButton的数量应从9x9更改为30x16 所以,我在主窗口的构造函数中向GridLayout添加了数量最大的QPushButton(这是硬模式) 问题在于,每次调用Don';t在Qt中可设置后立即重新喷漆,qt,user-interface,Qt,User Interface,我在扫雷游戏中使用 从简单模式更改为硬模式后,QPushButton的数量应从9x9更改为30x16 所以,我在主窗口的构造函数中向GridLayout添加了数量最大的QPushButton(这是硬模式) 问题在于,每次调用setVisible时,小部件似乎都会重新绘制。所以在硬模式的情况下,它会被调用30x16次,这会产生如下奇怪的效果: 那么,如何在这个循环中设置小部件不重新绘制呢 提前感谢。在进行这些“大规模”更改之前,您可以尝试调用父小部件,并在完成所有更改后重新启用它。也许我错了,但
setVisible
时,小部件似乎都会重新绘制。所以在硬模式的情况下,它会被调用30x16次,这会产生如下奇怪的效果:
那么,如何在这个循环中设置小部件不重新绘制呢
提前感谢。在进行这些“大规模”更改之前,您可以尝试调用父小部件,并在完成所有更改后重新启用它。也许我错了,但据我所知,在调用setVisible()之后,Qt不会立即呈现小部件。渲染是“render”事件的结果,除非手动调用render() 从官方Qt文档(): Qt还试图通过合并多个绘制事件来加快绘制速度 合并成一个。当多次调用update()或窗口系统 发送多个绘制事件,Qt将这些事件合并为一个具有 更大的区域(请参见QRegion::united()。函数的作用是 不允许这种优化,因此我们建议在任何时候都使用update() 可能 我的直觉告诉我,这不是绘画问题,而是布局问题(没有足够的空间以“硬模式”呈现每个按钮)。 另外,我认为在将按钮添加到布局时不应该使用Qt::AlignCenter,它会尝试将布局中的每个按钮居中。您应该将布局的父窗口小部件设置为中心(如果您没有创建一个并将其设置为中心),并正确设置大小策略(QWidget setSizePolicy)
但是正如@Mat所建议的,如果这真的是一个绘画问题,你可以使用setUpdatesEnabled(false/true)(如果setUpdatesEnabled解决了你的问题,请接受@Mat的解决方案)我认为你试图解决的问题是错误的。您不应该像这样更新小部件。如果您一定要这样做,那么在更改之前隐藏布局的父窗口小部件并在更改之后再次显示它应该是可行的
一个更好的方法是使用所有的电路板,并在最初准备好。切换到另一个板只需切换活动小部件即可。尝试启用/禁用,而不是可见/不可见:
void MainWindow::resetBtn(const int width, const int height)
{
int index = 0;
for (int i = 0; i < HARD_HEIGHT; i++)
for (int j = 0; j < HARD_WIDTH; j++)
btnArr[index++].setEnabled(j < width && i < height);
}
void主窗口::resetBtn(常量整数宽度,常量整数高度)
{
int指数=0;
对于(int i=0;iQPushButton的总数真的很大:30x16=480!!!我不习惯让人们改变他们的编程逻辑,但在这种情况下,我认为使用QPushButton
s不是更好的方法。在添加对象时,布局在尝试移动对象时一定会遇到非常糟糕的情况,并且可能您在刷新时间上达到了某些内部限制,以便重新绘制布局
我要做的是一个带有自定义paintEvent
方法的自定义小部件。在那里,您可以按所需的列数和行数划分单元格的宽度和高度,并在玩游戏时使用像素贴图绘制单元格
对于鼠标交互,最好使用自定义逻辑覆盖mousePressEvent
,该逻辑计算鼠标在网格中的位置,并调用相应的方法或发出指示事件位置的信号。编码不是很难。您还可以使用事件->按钮()
方法了解按下了哪个鼠标按钮,并根据需要发出不同的信号
我不习惯回答说最好改变你的整个计划,但在这种情况下,我认为你正在走“艰难的道路”。我知道这不是你正在寻找的答案,但是考虑一下这个可能性。它们的父控件是一个GRIDWIDGET,它没有<代码> StudioDistS启用(false)< /C>方法。gridWidget的父窗口小部件是MainWindow。我试过了,但没有改变。所有从QWidget派生的对象都有这个方法。您使用的是什么版本的Qt?它是QGridLayout的一个实例,不是从QWidget派生的。Qt版本是4.7.4,MingW4.4编译器调用父窗口小部件上的内容,而不是布局。如果您使用的是QMainWindow,请在中心小部件上调用它。我使用了中心小部件,但没有任何更改。你的机器能用吗?恐怕这不是我需要的。在我的游戏中显示不可用的按钮合适吗?@Ovilia,试试call button->setFlat(true)-这样你的按钮就不可见了。)
void MainWindow::resetBtn(const int width, const int height)
{
int index = 0;
for (int i = 0; i < HARD_HEIGHT; ++i) {
for (int j = 0; j < HARD_WIDTH; ++j) {
if (j < width && i < height) {
btnArr[index].setVisible(true);
} else {
btnArr[index].setVisible(false);
}
++index;
}
}
}
void MainWindow::resetBtn(const int width, const int height)
{
int index = 0;
for (int i = 0; i < HARD_HEIGHT; i++)
for (int j = 0; j < HARD_WIDTH; j++)
btnArr[index++].setEnabled(j < width && i < height);
}