我有 PyQt5 QLabels 随着 QMainWindow 大小的变化而扩展/收缩。当 QMainWindow 的大小调整为其初始尺寸以外的任何值时,我想获取 QLabels 的尺寸。
下面的脚本在 QMainWindow 中创建两个 QLabel。QLabel 展开,但顶部 QLabel 具有固定高度。QMainWindow 的创建尺寸为 400x300,并显示为最大化屏幕showMaximized()(在我的例子中为 1920 x 1080)。该脚本在 QMainWindow 显示之前和之后打印 QLabels 的尺寸。在显示之前,width()返回height()默认的 QLabel 值,在显示之后(屏幕最大化)width()并height()返回值,就好像 QMainWindow 的物理尺寸为 400x300 一样。这是打印的 wat:
label_1 Size Before Expanding: 100 100
label_2 Size Before Expanding: 100 30
label_1 Size After Expanding: 378 100
label_2 Size After Expanding: 378 171
Run Code Online (Sandbox Code Playgroud)
当 QMainWindow 最大化时,如何获得 QLabels 的真实尺寸?我是在Windows环境下运行的。
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy, QLabel, QVBoxLayout, …Run Code Online (Sandbox Code Playgroud) 我有一个继承 QPushButton 小部件的类。我想要该按钮的自定义外观,因此我覆盖了paintEvent 方法。我想绘制的所有按钮都是 QFrame 对象的子项。
我有一个问题。我不能重绘那些对象。
我的paintEvent函数:
void Machine::paintEvent(QPaintEvent*) {
QPainter painter(this);
QRect geo = this->geometry();
int x, y, width, height;
x = geo.x()-10;
y = geo.y()-10;
width = geo.width()-3;
height = geo.height()-5;
painter.fillRect(x, y, width, height, QColor(220,220,220));
painter.drawText(x+10, y+10, "Machine " + QString::number(id));
}
Run Code Online (Sandbox Code Playgroud)
当小部件位于 QFrame 的左上角时,所需的效果就可以了。但是当我将按钮移到其他地方时,小部件开始消失。在图像上,您可以看到发生了什么:

按钮只是向左下方移动了一些 px。为什么它像这样工作?作为该按钮的容器的 QFrame 足够大。
提前致谢 ;)
我有一个QHBoxLayout包括两个QLabel小部件.我的左边QLabel比右边大得多QLabel,但是,QHBoxLayout将输出分成两半,因此布局的左侧太小而布局的右侧太大.如何修改QHBoxLayout为每个包含的小部件创建不等比例的空间?
我QVBoxLayout用QWidget在运行时创建的对象动态填充。我也想在运行时将其删除,但是如何?
我可以一一删除小部件:
void QLayout::removeWidget(QWidget * widget)
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式遍历布局吗?
目前我正在尝试将自定义 QWidget 类添加到 QVBoxLayout。我遇到的问题是小部件根本没有出现在布局中。我什至尝试设置 QWidget 的最小大小,因为我认为小部件没有显示,因为它的默认大小设置为零。
这是类的简化:
class myWidget(QWidget):
def __init__(self):
super().__init__()
# Slider
self.mySlider = QSlider(Qt.Horizontal)
self.mySlider.setRange(-360, 360)
# LCD Screen
self.lcd = QLCDNumber()
self.lcd.setMinimumHeight(45)
self.lcd.setMaximumHeight(75)
# set Size
self.setMinimumSize(QSize(400,300))
Run Code Online (Sandbox Code Playgroud)
我删除了滑块和 LCD 屏幕之间的信号和插槽,因为我在这里不担心功能。只有我在以下代码中的两个按钮之间直接获得了 QSize(400,300) 的灰色区域:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
#Create Widgets to be Added to Central Widget
self.w1 = QPushButton("First")
self.w2 = myWidget()
self.w3 = QPushButton("Third")
#Set Central Widget and VBox
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout()
self.central_widget.setLayout(self.layout)
#Add widgets
self.layout.addWidget(self.w1)
self.layout.addWidget(self.w2)
self.layout.addWidget(self.w3)
Run Code Online (Sandbox Code Playgroud)
所以我所做的只是创建 3 个小部件,并将它们放入中央小部件内的 QVBoxLayout …
我试图QGridLayout在PyQt5中创建一个简单的图像,但发现自己卡住了因为QGridLayout只有通过.addWidget()和添加小部件和布局的功能.addLayout().
下面是我的代码,期望QWidget但有问题,因为我似乎无法找到任何QWidgets可以处理png/jpg文件.
class myGrid(QWidget):
def __init__(self):
QObject.__init__(self)
# Create Layout
self.lay = QGridLayout()
self.setLayout(self.lay)
i1 = QIcon("imgs/img1.png")
i2 = QIcon("imgs/img2.png")
i3 = QIcon("imgs/img3.png")
i4 = QIcon("imgs/img4.png")
# Add Images to Layout
self.lay.addWidget(i1, 0, 0) # Error because type(i1) != QWidget
Run Code Online (Sandbox Code Playgroud)
以上只是我想要添加到布局中的第一个图像.唯一的问题是,因为QIcon技术上不是QWidget我收到编译器错误.
我看了看其他QObjects的是处理图像,包括QImage与QPainter而是因为这些类的类型都是QtGui我无法将它们传递到我的网格.
有关如何QWidget从图像生成或使用特定QWidget处理图像的任何建议?
我有一个小部件,我将它放在另一个小部件中,我希望将它变成黑色。我正在使用以下代码。
这是我的内部小部件构造函数:
内部组件.cpp
#include "innerwidget.h"
#include <QStyle>
InnerWidget::InnerWidget(QWidget *parent) : QWidget(parent)
{
setMinimumSize(1280,70);
this->setStyleSheet("background-color: black");
style()->unpolish(this);
style()->polish(this);
update();
}
Run Code Online (Sandbox Code Playgroud)
这是我的外部小部件构造函数:
外部小部件.cpp
#include "outerwidget.h"
#include <QGridLayout>
OuterWidget::OuterWidget(QWidget *parent)
: QWidget(parent)
{
setMinimumSize(1280, 800);
setMaximumSize(1280,800);
innerWidget = new InnerWidget(this);
QGridLayout *layout = new QGridLayout;
layout->addWidget(innerWidget, 0, 0, 0, 4, Qt::AlignTop);
this->setLayout(layout);
this->setWindowState(Qt::WindowFullScreen);
}
OuterWidget::~OuterWidget()
{
}
Run Code Online (Sandbox Code Playgroud)
我的主要是非常简单的默认代码:
主程序
#include "outerwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
OuterWidget w;
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
我的头文件没什么特别的:
内部组件.h
#ifndef INNERWIDGET_H
#define …Run Code Online (Sandbox Code Playgroud) qwidget ×7
qt ×6
qlayout ×3
c++ ×2
pyqt5 ×2
dimensions ×1
pyqt ×1
pyside2 ×1
python ×1
qgridlayout ×1
qlabel ×1
qt5 ×1
qt5.4 ×1
qvboxlayout ×1