在Qt中,当我向布局添加小部件时,默认情况下它们是垂直居中的.有没有办法从上到下"列出"小部件而不是垂直居中?
我正在尝试从PySide应用程序中的布局中删除Qt小部件.
这是一个最小的例子.它是一个包含5个按钮的小部件,中间的按钮应该在单击时自行删除:
import sys
from PySide import QtGui
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
buttons = [QtGui.QPushButton(str(x)) for x in xrange(5)]
def deleteButton():
b = layout.takeAt(2)
buttons.pop(2)
del b
buttons[2].clicked.connect(deleteButton)
map(layout.addWidget, buttons)
widget.setLayout(layout)
widget.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
实际发生的是:

按钮是不可点击的,显然没有考虑布局计算,但其图像保持不变.
根据Qt文档,从布局中删除所有对象的正确方法是:
while ((child = layout->takeAt(0)) != 0) {
delete child;
}
Run Code Online (Sandbox Code Playgroud)
在这里我只想删除第三个按钮,所以我只是调用takeAt(2),然后del b在该项上调用析构函数.按钮对象也是列表中的.pop'd' buttons,以确保没有对该对象的剩余引用.我的代码与导致此类行为的Qt文档中的代码有何不同?
我想创建一些选项卡,我读到了这个答案:如何在PySide中添加选项卡
我在答案中使用代码并进行了一些更改.因为我的代码必须读取一些文件并从这些文件中获取我的选项卡的名称,以便在我的代码中添加for循环.这是我的代码.
from PySide import QtCore, QtGui
import sys
import dflash_controller as con
if __name__ == "__main__":
list = [['a', 3], ['b', 4], ['c', 5], ['d', 6]]
app = QtGui.QApplication(sys.argv)
wid = QtGui.QWidget()
grid = QtGui.QGridLayout(wid)
wid.setLayout(grid)
# setting the inner widget and layout
grid_inner = QtGui.QGridLayout(wid)
wid_inner = QtGui.QWidget(wid)
wid_inner.setLayout(grid_inner)
# add the inner widget to the outer layout
grid.addWidget(wid_inner)
# add tab frame to widget
wid_inner.tab = QtGui.QTabWidget(wid_inner)
grid_inner.addWidget(wid_inner.tab)
# create tab
for i, index in enumerate(list[0:]): …Run Code Online (Sandbox Code Playgroud) 在Qt创建器中使用设计器我创建了一个对话框,其中包含垂直布局中的各种小部件.其中一个小部件是QLabel,其中自动换行设置为true.QLabel的文本在对话框显示之前设置.
QLabel的最大宽度和高度为16777215,垂直尺寸策略设置为" 扩展",水平线为" 首选".我已经尝试过更改大小政策.
我遇到的问题是,如果文本很大,QLabel无法相应调整,文本被剪裁,如下所示: -

我尝试在设置文本后调用updateGeometry(),并尝试在垂直布局上调用update,但似乎没有任何区别.理想情况下,我希望QLabel垂直调整以适应文本.
谁能告诉我我在这里失踪了什么?
我有一个QGLWidget,我想调整大小到给定的分辨率(大于包含窗口).我的意图是,窗口会扩展,直到小部件适合内部,但无法找到方法.
我在调整QGLWidget的大小后尝试了几个命令,使其工作没有成功.我将在此列出结果:
mainWindow.adjustSize():窗口小部件调整大小为(0,0)mainWindow.resize(mainWindow.sizeHint()): 往上看mainWindow.resize(mainWindow.minimumSizeHint()): 往上看我也读过这个帖子,在执行mainWindow调整之前我需要运行事件循环来重新计算新的大小,所以我插入QCoreApplication::processEvents这样做,没有任何可见的效果.
那么如何通过窗口小部件调整窗口大小?
编辑
GLWidget不是窗口的唯一窗口小部件.它与分组盒一起嵌入分离器中.
我试图将 QHBoxlayout 中的每个小部件对齐到顶部,但我得到的是每个小部件似乎都居中。我认为这是由于尺寸不同造成的。
例如:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
class SurfViewer(QMainWindow):
def __init__(self, parent=None):
super(SurfViewer, self).__init__()
self.parent = parent
self.setFixedWidth(300)
self.setFixedHeight(100)
self.wid = QWidget()
self.setCentralWidget(self.wid)
self.groups = QHBoxLayout()
l_a1 = QLabel('A')
a = QVBoxLayout()
a.addWidget(l_a1)
self.groups.addLayout(a)
l_a2 = QLabel('A')
l_b2 = QLabel('B')
a_b = QVBoxLayout()
a_b.addWidget(l_a2)
a_b.addWidget(l_b2)
self.groups.addLayout(a_b)
l_a3 = QLabel('A')
l_b3 = QLabel('B')
l_c3 = QLabel('C')
a_b_c = QVBoxLayout()
a_b_c.addWidget(l_a3)
a_b_c.addWidget(l_b3)
a_b_c.addWidget(l_c3)
self.groups.addLayout(a_b_c)
self.groups.setAlignment(Qt.AlignTop)
self.wid.setLayout(self.groups)
if __name__ == '__main__':
app …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用a布局窗口(所有代码)QGridLayout.我可以添加小部件到布局,它们显示在我的窗口中,但我无法弄清楚如何正确调整它们的大小.这就是我想要的
[Leftmost][--------Center---------][Rightmost]
Run Code Online (Sandbox Code Playgroud)
这些是我窗口的3个"窗格"(所有三个列表).左侧和右侧应该具有静态宽度并且拥抱它们各自的侧面,并且当窗口增大(或收缩)时,中心应该扩展以填充宽度.
一些代码:
// Create the subviews, add them to a grid layout, and set the layout to the window.
QTableView *list = new QTableView(0);
list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QTableView *flashList = new QTableView(0);
flashList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QPushButton *infoButton = new QPushButton("Info!");
QPushButton *flashFeedsButton = new QPushButton("Flashfeeds");
QGridLayout *gridLayout = new QGridLayout;
// Set the minimum widths for all three columns of the grid
gridLayout->setColumnMinimumWidth(GridColumnFirst, 300);
gridLayout->setColumnMinimumWidth(GridColumnSecond, 300);
gridLayout->setColumnMinimumWidth(GridColumnThird, 300);
// Set the minimum heights for all rows of the …Run Code Online (Sandbox Code Playgroud) 我有一个自定义小部件,其总体布局为QVBoxLayout.它包含几个标签,一个QFormLayout,一个按钮,以及一个吃掉所有多余空间的伸展.其中一个标签可能非常大,所以我试图确保没有文本不可读的奇怪情况.小部件包含在QScrollArea中,以确保如果用户缩小整个窗口,仍然可以看到小部件的所有方面.
QLabel似乎调整得很好,但是一旦达到某个狭窄点,它就会切断标签底部的几行,并将空间分配给小部件底部的拉伸.
我在没有Designer的代码中完成所有操作,所以我完全有可能错过了一些东西.子组件按以下顺序添加到整个QVBoxLayout:
OverallLayout = new QVBoxLayout(this);
Title = new QLabel();
Description = new QLabel();
SubRegion = new QFormLayout();
Button = new QButton();
...
// set text values, wordWrap(true), and Font for labels
OverallLayout->addWidget(Title);
OverallLayout->addWidget(Description);
OverallLayout->addLayout(SubRegion);
OverallLayout->addStrut(MIN_DIST);
OverallLayout->addWidget(Button);
OverallLayout->addStretch(STRETCH_FACTOR);
Run Code Online (Sandbox Code Playgroud)
测试结果:检查从QLabel的sizeHint()函数返回的结果,返回的值似乎不会随着窗口小部件水平收缩而更改.然而,QLabel确实扩展到占据更多的垂直空间(153与103的暗示),仅仅不足以适应所有文本.首次显示QLabel时,它的像素数小于sizeHint,但仍足以支持其heightForWidth数量.调整大小时,它的heightForWidth数量小于30,但大于它的sizeHint.
我检查过,大型QLabel的hasHeightForWidth()和wordWrap()值设置为true.我究竟做错了什么?
我能够找到QRadioButton这种方式:
for(int i = 0; i < ui->verticalLayout->count(); i++)
{
QRadioButton* r = qobject_cast<QRadioButton*>(ui->verticalLayout->itemAt(i)->widget());
if(r->isChecked())
//found it!
}
Run Code Online (Sandbox Code Playgroud)
但我不喜欢这种迭代元素的方式,并希望使用该foreach构造.我的第一次尝试失败了
foreach(QRadioButton* child, ui->verticalLayout->findChildren<QRadioButton*>())
{
if(child->isChecked())
//found it!
}
Run Code Online (Sandbox Code Playgroud)
问题是ui->verticalLayout->findChildren<QRadioButton*>()返回零元素.它也不返回任何元素findChildren<QObject*>().有人可以解释一下这种行为吗?
注意:这个问题的标题几乎与我的相同,但它与python Qt有关,并且不包含任何有用的信息.
实验上,我认为ui->verticalLayout->children().count()返回零,其中ui->verticalLayout->count()返回我在中的元素数量verticalLayout.这意味着itemAt(i)并且findChild<QRadioButton*>()不访问相同的列表.查看Qt文档对children()我没有帮助.
有人能指出我关于Qt孩子父母概念的好材料吗?我假设这与访问嵌套对象无关,这正是我想要完成的.
正如Kuba Ober所建议的那样,这个问题的答案包含了关于另一个主题的有价值的信息,而他的答案则澄清了我关于布局儿童的问题.因此,这不是一个重复的问题.
我QGridLayout经常使用,并且有一个需求我不知道如何或者我是否可以通过这种布局来实现。
我的问题:想象一下,我QWidget的左右两侧(在QHBoxLayout或 之类的东西上)有两个普通小部件(源自QGridLayout),我希望用户可以移动分隔它们的线。那可能吗?
更多信息: 举个例子,想象一下默认的 Windows 注册表编辑器。左边是键和路径,右边是要编辑的值。
我想强调的是,我不是在要求浏览器视图。我拥有的基本上是右侧的绘图小部件和QTableView左侧的小部件,我希望用户能够方便地用鼠标缩放,哪个小部件应该在水平方向上更大。
是否有某种可通过鼠标缩放的布局?
请询问您需要的更多信息。
谢谢!