方法一:直接在编辑框中加上按钮,代码如下所示:
QLineEdit *edit =new QLineEdit(this);
QPushButton *btn=new QPushButton(edit);
btn->setText(".......");
btn->setCursor(Qt::ArrowCursor);
QWidgetAction* action = new QWidgetAction(edit);
action->setDefaultWidget(btn);
edit->addAction(action, QLineEdit::TrailingPosition); //第二个参数设置按钮位置
再配合qss做样式表,可以实现简单的编辑框中嵌入按钮,如下所示:
但是这种方法虽然简单,但是局限性也非常明显,首先按钮的大小基本上可以说是固定死了,比如高度,如果手动设置按钮的宽度,则会出现下面这样的效果:
这里没有找到比较好的处理办法(如果有请各位不吝赐教)。
方法二:重写QLineEdit控件,在空间中添加按钮,代码如下所示:
LineEdit::LineEdit(QWidget* parent)
: QLineEdit(parent)
{
QPushButton* btn=new QPushButton(this);
QHBoxLayout* layout=new QHBoxLayout(this);
layout->setMargin(0);
layout->setSpacing(0);
layout->addStretch(1);
layout->addWidget(btn);
this->setLayout(layout);
btn->setFixedSize(30,30);
this->setFixedSize(100,30);
}
这里为了省事,直接加了一个布局在里面,这里再可以设置按钮的高度和编辑框高度一样,再配合qss样式表,几乎可以为所欲为,效果图如下:
方法三:在编辑框和按钮外面套一层QFrame实现,界面布局如下所示:
这里为了让感官看上去编辑框和按钮是在一起的,边框只能设置到QFrame上,同时必须把编辑框和按钮的背景透明。
总结:
应该说方法三是用的比较多的,因为编辑框和按钮的样式不会相互影响,所有边框相关的样式都直接在QFrame上设置,但是方法三有一个问题:假如编辑框获取焦点和失去焦点,QFrame的外边框颜色不一样,这要实现是有点麻烦的,首先需要重写QLineEdit,拿到它的得到焦点和失去焦点的事件,然后通知到QFrame上动态修改属性并刷新样式,但是对于方法二来说就不存在这样的问题。方法二中如果qss中不设置编辑框的padding-right属性的话,输入的文字是会跑到按钮下面去的,所以方法二中需要动态设置padding-right属性。
是否还有其他方法可以设置,请各路大神赐教。
补充,收到一位大佬的方案,直接将编辑框和按钮重叠在一起(要注意编辑框要先于按钮创建,否则如果编辑框不透明,可能会挡住按钮),分别设置各自的样式表,另外为了适应编辑框动态缩放,可以直接在resizeEvent函数中动态设置按钮的位置和大小即可,感谢大佬的方案。