我遇到了PyQt4的问题.我想在窗口中创建一个新的小部件,我希望这个小部件具有自定义颜色.
当我创建QWidget类的子类并实例化它时,我无法通过setStyleSheet()函数更改其背景颜色.
当我实例化一个新的QWidget对象时,我在更改其背景颜色方面没有任何问题.但我不想要一个普通的QWidget对象.我想创建自己的QWidget子类.
当我创建QPushButton的子类时,我也可以使用setStyleSheet()函数更改其背景颜色.
控制台窗口中没有错误消息或警告,它只是拒绝正常工作而没有任何关于原因的指示.
所以我想知道的是,为什么我可以改变窗口小部件的背景颜色,如果我只是创建一个QWidget对象,或QPushButton的子类,但不是当我创建QWidget的子类时.那么我怎样才能改变作为QWidget子类的对象的背景颜色?
它可能是我正在使用的python或PyQt版本特有的东西吗?这是库中的错误吗?或者我编写代码的方式有些缺陷?
我使用的是python 2.6.4和PyQt4
以下是导致我遇到麻烦的代码示例.窗口内有三个小部件,一个在另一个之下.父窗口小部件的背景颜色为绿色.顶部小部件设置为红色,中间的小部件是QWidget的子类,它应该是蓝色的,但它看起来是不可见的,因为它出于某种原因呈现父窗口的颜色.底部小部件是QPushButton的子类,是白色的.
import sys
from PyQt4 import QtGui, QtCore
################################################################################
#--------------------------------------------------------- CUSTOM WIDGET CLASS 1
class CustomWidget(QtGui.QWidget):
def __init__(self, parent):
QtGui.QWidget.__init__(self, parent)
# some custom properties and functions will follow
################################################################################
#--------------------------------------------------------- CUSTOM WIDGET CLASS 2
class CustomWidget2(QtGui.QPushButton):
def __init__(self, parent):
QtGui.QPushButton.__init__(self, parent)
# some custom properties and functions will follow
################################################################################
#----------------------------------------------------------- PARENT WIDGET CLASS
class Parent(QtGui.QWidget):
def __init__(self, parent=None):
#---------------------------------------------------------- SETUP WINDOW
QtGui.QWidget.__init__(self, parent)
self.resize(500, 340) …Run Code Online (Sandbox Code Playgroud) 我有
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget (QWidget *parent);
// ...
};
// here is ALL the code in MyWidget constructor
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
glWidget = new GLWidget(this, cluster);
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(glWidget);
setLayout(mainLayout);
setWindowTitle("Visualization");
}
Run Code Online (Sandbox Code Playgroud)
和主窗口MainWindow w;.
我想要
w;QCloseEvent或之后要销毁的实例w(现在它们只在之后被销毁QCloseEvent);我正在创建这样的新实例MyWidget:
void MainWindow::visualize()
{
MyWidget *widg = new MyWidget(this); // or widg = new MyWidget(0)
widg->show();
widg->raise();
widg->activateWindow(); …Run Code Online (Sandbox Code Playgroud) 我想填充QGridLayout用QWidgets.在QWidgets需要出现在左上至右上的方式,并继续向下填补了下来每一行充满后QWidgets.类似且熟悉的GUI的一个例子是Apple如何在iPhone或iPad的主屏幕上对其应用程序进行分类.应用程序从左上角到右上角,并在每行填充后继续向下移动.
现在,每当我添加元素时,它们都会占据整个屏幕和/或不会彼此相邻添加.
这是我正在做的示例代码
m_gridLayout = new QGridLayout(this);
this->setLayout(m_gridLayout);
m_gridLayout->addWidget(widgetToBeAdded, m_currentRow, m_currentColumn, Qt::AlignLeft);
Run Code Online (Sandbox Code Playgroud)
我按预期继续更新m_currentColumn和m_currentRow.在一定数量的列之后,我告诉它改为下一行,没有任何反应.我已通过调试确认它实际上正在吐出正确的行和列.)
最后,我需要抛出一个,QScrollArea以便可以向下滚动网格.
每个的大小都是QWidget一样的.如果我能够在正确分类网格方面获得任何帮助,我们将不胜感激.
编辑:使用下面的答案,我设法让我的项目按正确的顺序排序.但是,在垂直方向上的所有元素之间存在大量空间.正如我想的那样,改变verticalSpacing属性并不能避免这种情况.有谁知道怎么办?
我正在尝试创建一个主窗口(QWidget),当单击一个按钮时打开一个新的QWidget但是当我关闭主窗口时,最近打开的QWidget没有关闭.
main.cpp中
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
Run Code Online (Sandbox Code Playgroud)
mainwindow.cpp(父)
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
Run Code Online (Sandbox Code Playgroud)
out.cpp(孩子)
Out::Out(QWidget *parent) :
QWidget(parent),
ui(new Ui::Out)
{
ui->setupUi(this);
}
Run Code Online (Sandbox Code Playgroud) 使用鼠标拖动窗口小部件时,可以自由移动窗口(带框架的窗口小部件).我想要实现的是将移动的小部件移动到某些区域,例如移动到屏幕的其他小部件或边框.例如,Winamp中的播放列表窗口会捕捉到主窗口.如何实现这样的行为?
我有一个使用Qt styleSheet的Qt Widgets应用程序来获得应用程序的外观.我们希望添加对高DPI显示器的支持,因为这些应用看起来非常小.因此,第一步是:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
Run Code Online (Sandbox Code Playgroud)
这可以完成大部分工作,应用程序窗口足够大.唯一剩下的问题是样式表中使用的图像的分辨率.
说我们有:
QCheckBox::indicator::unchecked {
image: url(:/res/checkbox_off.png);
}
MainWindow QFrame {
background-image: url(:/res/background.png);
}
Run Code Online (Sandbox Code Playgroud)
当使用高DPI缩放时,这些图像会相应地升级,这是一个问题.对于高DPI,我宁愿使用更高分辨率的图像,使它们看起来尽可能清晰.
正如所料,简单地以更高分辨率提供图像的简单方法不起作用 - 它使图像和控制的两倍大(在低和高DPI屏幕上).
关于QImageReader的Qt文档说明了这一点
高分辨率版本在基本名称上标有后缀@ 2x.读取的图像将其设备像素比率设置为值2.
但是,我提供了两倍分辨率的这些资源,将它们添加到qrc文件中,但在pixel_ratio为3的设备上显示的图像仍然相同.
是否还需要其他步骤才能使自动图像加载与样式表一起使用?
主要问题
如果有额外的或没有足够的空间来容纳它们,那么为您的小部件提供默认大小并确保它们收缩、扩展或保持固定的“正确”方法是什么?
我认为 Qt 是如何工作的
阅读 Qt 文档后,大小调整算法似乎是这样的......布局首先通过 QWidget::sizeHint 方法询问其子级的理想大小。如果布局有额外空间或空间不足,那么它将根据每个小部件的大小策略(QWidget::sizePolicy)、最小大小(QWidget::minimumSize)和最大大小(QWidget::maximumSize)确定要调整哪些小部件的大小。
为什么没有 QWidget::setSizeHint 方法?
如果我的理解接近准确,那么似乎您所要做的就是在每个小部件上设置 sizeHint、sizePolicy、maximumSize 和 minusSize,一切都会正常工作。那么为什么没有 setSizeHint 方法呢?!?!?!!当然,每次您使用一个提供您需要的所有功能的小部件(QTableView、QComboBox 等)时,您都可以扩展它并覆盖单个方法,但这听起来绝对荒谬。
我正在努力解决的尺寸问题之一。
我有一个 QMainWindow,左侧有一个 QDockWidget。QDockWidget 有一个 QTableView。我想让 QDockWidget/QTableView 在启动时占用“合理”的空间量,然后用户可以根据需要调整其大小。
不幸的是,当应用程序启动时,它为 QDockWidget/QTableView 提供的空间太小,以至于需要水平滚动条。我发现强制它提供合理宽度的唯一方法是设置 QDockWidget 的最小宽度,但它会阻止用户将其大小调整到他们想要的大小。
我一直在研究两个类QOpenGLWindow和QOpenGLWidget。在 QOpenGLWindow 的文档中,它指出:“与 QOpenGLWidget 不同,QOpenGLWindow 不依赖于 widgets 模块,并提供更好的性能。” 在我当前的项目中,我制作了一个QMainWindow带有Dock 小部件QDockWidget的OpenGLWidget。
对于这个项目,我需要 GL 部分尽可能高效,所以我想知道是否值得尝试将其转换为QOpenGLWindow. 但是,我不知道性能差异是什么。如果它很小,那么我将保留当前的格式,如果差异很大,那么我将转换它。
有谁知道性能差异是什么?
Qt 的小部件有 2 个属性决定它们可以有多小:
现在它们的基本区别似乎已经很清楚了:minimumSize限制小部件实际可以具有的大小,并且 Qt 不允许将大小设置得更小。如果设置的话,它也会覆盖minimumSizeHint。然后minimumSizeHint仅由布局使用,布局不会将小部件的大小调整为小于调整其内容大小时的大小。
现在我正在实现一个自定义小部件,没有任何问题,我开始想知道这一点。
问题:您为什么要使用mininumSizeHint?在什么情况下,您必须或想要使用它而不是总是使用minimumSize?为什么minimumSizeHint存在?
(如果答案是“是的,sizeHint一切都足够了”,那很好。)
升级到PySide6.3.0后出现错误ModuleNotFoundError: No module named 'PySide6.QtWidgets'
import sys
from PySide6.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("Hello World!")
label.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)
$ python3.10 test.py
Traceback (most recent call last):
File "test.py", line 2, in <module>
from PySide6.QtWidgets import QApplication, QLabel
ModuleNotFoundError: No module named 'PySide6.QtWidgets'
Run Code Online (Sandbox Code Playgroud)
看来有变化PySide6.3.0。
如何导入QtWidgets模块PySide6.3.0?
很明显它正在导入 PySide6 包,但它没有导入 QtWidgets、QtGui、QtCore 等包
#!/usr/bin/env python3.10
import sys
import PySide6
from PySide6 import QtWidgets
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QPushButton, QVBoxLayout, …Run Code Online (Sandbox Code Playgroud) qwidget ×10
qt ×7
c++ ×2
grid-layout ×1
hdpi ×1
importerror ×1
layout ×1
performance ×1
pyqt ×1
pyqt4 ×1
pyside6 ×1
python ×1
python-3.10 ×1
qgridlayout ×1
qlayout ×1
qsizepolicy ×1
qt4 ×1
qt5 ×1
qtgui ×1
qwindow ×1
stylesheet ×1