Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将按钮锚定到小部件?_C++_Qt - Fatal编程技术网

C++ 如何将按钮锚定到小部件?

C++ 如何将按钮锚定到小部件?,c++,qt,C++,Qt,我创建了一个非常简单的窗口,上面有一个按钮。我的按钮id距窗口右边缘10像素,距窗口底部10像素。我想保持这个位置,即使窗口将被调整大小。也就是说,从右边还是10,从底部还是10 怎么做 谢谢 zalkap在具有2列和2行的小部件上安装QGridLayout,在右下角单元格上添加按钮,然后将第一行和第一列设置为拉伸 QWidget *widget = new QWidget(); // The main window QGridLayout *layout = new QGridLayout(w

我创建了一个非常简单的窗口,上面有一个按钮。我的按钮id距窗口右边缘10像素,距窗口底部10像素。我想保持这个位置,即使窗口将被调整大小。也就是说,从右边还是10,从底部还是10

怎么做

谢谢


zalkap

在具有2列和2行的小部件上安装QGridLayout,在右下角单元格上添加按钮,然后将第一行和第一列设置为拉伸

QWidget *widget = new QWidget(); // The main window
QGridLayout *layout = new QGridLayout(widget); // The layout
QPushButton *button = new QPushButton(QString("Button"), widget); // The button

layout->setContentsMargin(10,10,10,10); // To have 10 pixels margins all around the widget
layout->addWidget(button, 1, 1);
layout->setRowStretch(0, 1);
layout->setColumnStretch(0, 1);

通常,使用布局。它是最简单、最健壮的解决方案,最适用于不可预测的小部件大小(在大多数情况下,由于平台、字体大小、翻译字符串等的不同,它们是不可预测的)。如果确实需要手动定位某些对象(不经常发生),可以在父对象中重新实现resizeEvent(),然后自己移动子对象。例如

void MyParentWidget::resizeEvent( QResizeEvent* ) {
    m_child->move( width() - m_child->width() - 10, height() - m_child->height() - 10 ); 
}

这会将子项移动到右下角。

有时使用布局几乎是不可能的,尤其是在处理自定义小部件或复合小部件时,并且希望重叠某些保持不变的内容,因此唯一有效的解决方案仍然是resizeEvent()。更糟糕的是,在处理复合自定义小部件时,installEventFilter可能是避免子类化的唯一方法。我不会接受这个答案,即使它完成了任务。它为OP的案例提供了一个解决方案,但不能帮助未来的检查人员了解如何在不使用网格的情况下进行检查。用例是用户定义的UI位置,用于UI配置文件的某种按钮。