标签: qlayout

QVBoxLayout:如何将小部件垂直对齐到顶部而不是中心

在Qt中,当我向布局添加小部件时,默认情况下它们是垂直居中的.有没有办法从上到下"列出"小部件而不是垂直居中?

qt qlayout

42
推荐指数
4
解决办法
7万
查看次数

PySide:从布局中删除小部件

我正在尝试从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文档中的代码有何不同?

python qt pyside qlayout

21
推荐指数
1
解决办法
1万
查看次数

QLayout:尝试将QLay""添加到QWidget"",它已经有了布局

我想创建一些选项卡,我读到了这个答案:如何在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)

python tabs qwidget pyside qlayout

21
推荐指数
1
解决办法
3万
查看次数

在布局中设置QLabel上的文本不会调整大小

在Qt创建器中使用设计器我创建了一个对话框,其中包含垂直布局中的各种小部件.其中一个小部件是QLabel,其中自动换行设置为true.QLabel的文本在对话框显示之前设置.

QLabel的最大宽度和高度为16777215,垂直尺寸策略设置为" 扩展",水平线为" 首选".我已经尝试过更改大小政策.

我遇到的问题是,如果文本很大,QLabel无法相应调整,文本被剪裁,如下所示: -

在此输入图像描述

我尝试在设置文本后调用updateGeometry(),并尝试在垂直布局上调用update,但似乎没有任何区别.理想情况下,我希望QLabel垂直调整以适应文本.

谁能告诉我我在这里失踪了什么?

c++ layout qt qt-creator qlayout

14
推荐指数
2
解决办法
2万
查看次数

调整窗口大小以适合内容

我有一个QGLWidget,我想调整大小到给定的分辨率(大于包含窗口).我的意图是,窗口会扩展,直到小部件适合内部,但无法找到方法.

我在调整QGLWidget的大小后尝试了几个命令,使其工作没有成功.我将在此列出结果:

  • 什么都不做:Widget重叠整个窗口.最终它将调整大小以适应较小的窗口
  • mainWindow.adjustSize():窗口小部件调整大小为(0,0)
  • mainWindow.resize(mainWindow.sizeHint()): 往上看
  • mainWindow.resize(mainWindow.minimumSizeHint()): 往上看

我也读过这个帖子,在执行mainWindow调整之前我需要运行事件循环来重新计算新的大小,所以我插入QCoreApplication::processEvents这样做,没有任何可见的效果.

那么如何通过窗口小部件调整窗口大小?

编辑

GLWidget不是窗口的唯一窗口小部件.它与分组盒一起嵌入分离器中.

qt qlayout

10
推荐指数
1
解决办法
4万
查看次数

将 QHBoxLayout 的每个小部件对齐到顶部

我试图将 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)

python pyqt alignment pyqt5 qlayout

7
推荐指数
1
解决办法
1万
查看次数

QGridLayout,3个窗格,没有正确扩展

我正在尝试使用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)

qt qgridlayout qlayout

6
推荐指数
1
解决办法
1万
查看次数

QLabel在调整大小时切断文本

我有一个自定义小部件,其总体布局为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.我究竟做错了什么?

c++ layout qt qlayout

6
推荐指数
1
解决办法
4598
查看次数

如何在QLayout中找到给定类型的小部件?

我能够找到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所建议的那样,这个问题的答案包含了关于另一个主题的有价值的信息,而他的答案则澄清了我关于布局儿童的问题.因此,这不是一个重复的问题.

c++ qt qlayout

6
推荐指数
1
解决办法
1414
查看次数

Qt 中可调整大小的布局/框架,由用户为每个小部件

QGridLayout经常使用,并且有一个需求我不知道如何或者我是否可以通过这种布局来实现。

我的问题:想象一下,我QWidget的左右两侧(在QHBoxLayout或 之类的东西上)有两个普通小部件(源自QGridLayout),我希望用户可以移动分隔它们的线。那可能吗?

更多信息: 举个例子,想象一下默认的 Windows 注册表编辑器。左边是键和路径,右边是要编辑的值。

我想强调的是,我不是在要求浏览器视图。我拥有的基本上是右侧的绘图小部件和QTableView左侧的小部件,我希望用户能够方便地用鼠标缩放,哪个小部件应该在水平方向上更大。

是否有某种可通过鼠标缩放的布局?

请询问您需要的更多信息。

谢谢!

c++ qt qt5 qlayout

6
推荐指数
1
解决办法
4535
查看次数

标签 统计

qlayout ×10

qt ×8

c++ ×4

python ×3

layout ×2

pyside ×2

alignment ×1

pyqt ×1

pyqt5 ×1

qgridlayout ×1

qt-creator ×1

qt5 ×1

qwidget ×1

tabs ×1