Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ 设置QPushButton的最小宽度,同时保持默认的minimumSizeHint行为_C++_Qt_Qtstylesheets_Qpushbutton - Fatal编程技术网

C++ 设置QPushButton的最小宽度,同时保持默认的minimumSizeHint行为

C++ 设置QPushButton的最小宽度,同时保持默认的minimumSizeHint行为,c++,qt,qtstylesheets,qpushbutton,C++,Qt,Qtstylesheets,Qpushbutton,在我的应用程序中,我需要所有s的宽度至少为150px,但如果需要,则更大。 为此,我使用了一个全局样式表,该样式表包含许多其他具有以下简单约束的属性: QPushButton { min-width: 150px; } 问题是,我还希望带有文本的按钮不能在150px内缩小到整个文本无法显示的宽度。 这应该是QPushButton的正常行为,但问题在于,正如文档中所解释的: QLayout永远不会将小部件的大小调整为小于最小大小提示的大小,除非设置了minimumSize或大小策略设置为

在我的应用程序中,我需要所有s的宽度至少为150px,但如果需要,则更大。 为此,我使用了一个全局样式表,该样式表包含许多其他具有以下简单约束的属性:

QPushButton {
    min-width: 150px;
}
问题是,我还希望带有文本的按钮不能在150px内缩小到整个文本无法显示的宽度。 这应该是QPushButton的正常行为,但问题在于,正如文档中所解释的:

QLayout永远不会将小部件的大小调整为小于最小大小提示的大小,除非设置了minimumSize或大小策略设置为QSizePolicy::Ignore。如果设置了minimumSize,将忽略最小大小提示

这导致某些情况下,长文本按钮在启动时以正确的大小显示,但缩小窗口时,按钮变得太小,无法显示所有文本。 我准备了一个简单的例子来说明这种行为:

包括 包括 包括 包括 int main argc,char*argv[] { QApplication aargc,argv; QWidget*w=新的QWidget; QLayout*布局=新的QHBoxLayoutw; QPushButton*buttonA=新的QPushButtonA,w; QPushButton*buttonB=新的QPushButtonB,w; 按钮B->SetStyleSheet最小宽度:150px; QPushButton*buttonC=新的QPushButton长文本,不适合150px,w; QPushButton*Button=新的QPushButton检查非常长的文本,该文本不适合150px,w; 按钮->设置样式最小宽度:150px; 布局->添加WidgetButtona; 布局->添加WidgetButtonB; 布局->添加WidgetButtonC; 布局->添加WidgetButtond; w->show; 返回a.exec; } 我曾考虑使用将最小宽度约束仅设置为基本宽度<150px的按钮,但这似乎不可行。
有没有一种方法可以实现我对样式表的要求,或者我必须对QPushButton进行子类化并覆盖minimumSizeHint方法,因为我必须替换我应用程序中的许多按钮?如果你对QPushButton进行子类化会更好。但有两种方法可以解决此问题:

您可以将长文本拆分为特定数量的字符,并在鼠标进入按钮时使用setToolTipQString函数显示全文

您可以覆盖父窗口小部件resizeEvent,并可以检查宽度,如果大小变得非常小,则选择方法1

使用Elide文本。不确定这是否有效


我还没有找到一种只使用样式表的方法来实现这一点,但下面是我通过子类化QPushButton提出的解决方案

MyButton.h

包括 类MyButton :公共按钮 { Q_对象 Q_属性INT最小宽度读取最小宽度写入设置最小宽度 公众: MyPushButtonQWidget*parent=nullptr; 虚拟按钮; int最小宽度常数; void setMinWidthint width; 虚拟QSize最小值SizeHint常量覆盖; 私人: int_minWidth; }; MyButton.cpp

包括MyButton.h MyPushButton::MyPushButtonQWidget*父项 :qpushButton租金 ,_min0 { } MyButton::~MyButton { } int mybutdown::minWidth常量 { 返回最小宽度; } void mybutdown::setMinWidthint宽度 { _最小宽度=宽度; } QSize MyButtomple::minimumSizeHint常量 { //如果最小宽度小于minWidth,请将其设置为minWidth //否则返回默认的minimumSizeHint 返回QSizeqMaxQPushButton::minimumSizeHint.width,_minWidth, QPushButton::minimumSizeHint.height; } stylesheet.qss


最小SizeHint宽度小于150px的按钮将被强制设置为该大小,较大的按钮将保留QPushButton的默认行为。

我希望避免直接接触代码,因为这已经是一个庞大的项目,我们最近注意到了这个问题。但是看起来没有其他选择,所以我想子类化QPushButton确实是最好的主意。不过我喜欢工具提示技巧,所以我可能会尝试一下。
MyPushButton {
    qproperty-minWidth: 150;
}