我有一个QLabel以自定义QGraphicsPolygonItem为中心,我使用QAction来更改标签文本,但是当文本更改时标签大小不会改变,我希望它调整为新文本的大小并保持中心。这是我的自定义项目构造函数:
DiagramItem::DiagramItem(DiagramType diagramType, QMenu *contextMenu,
QGraphicsItem *parent)
: QGraphicsPolygonItem(parent){
QGraphicsProxyWidget* pMyProxy = new QGraphicsProxyWidget(this);
QLabel *label = new QLabel();
label->setText(QString("I AM A SQARE DADADA"));
label->setTextInteractionFlags(Qt::TextEditorInteraction);
label->setStyleSheet("QLabel { background-color : red; color : blue; }");
pMyProxy->setWidget(label);
pMyProxy->setPos(this->boundingRect().center()-label->rect().center());
...
这是我用来更改标签文本的插槽:
void MainWindow::setItemLabel(){
if(!scene->selectedItems().isEmpty())
{
auto *item = scene->selectedItems().first();
if(!(item->childItems().isEmpty()))
{
auto proxy = static_cast<QGraphicsProxyWidget *>(item->childItems().first());
if(proxy)
{
auto label = qobject_cast<QLabel*>(proxy->widget());
if(label)
{
QDialog *diag = new QDialog(this);
QComboBox *box = new QComboBox();
QLineEdit *lt = new QLineEdit();
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel);
QVBoxLayout *mainLayout = new QVBoxLayout();
connect(buttonBox, SIGNAL(accepted()), diag, SLOT(accept()));
connect(buttonBox, SIGNAL(rejected()), diag, SLOT(reject()));
mainLayout->addWidget(lt);
mainLayout->addWidget(buttonBox);
diag->setLayout(mainLayout);
if(diag->exec() == QDialog::Accepted){
QString *usrInpt = new QString();
*usrInpt = lt->text();
label->rect().setWidth(usrInpt->length());
label->setText(*usrInpt);
}
}
}
}
}
这是我得到的结果,这是在触发上面的插槽之前: 这是我在触发插槽后得到的内容:
这条线也没有做任何事情,我不明白为什么:
label->rect().setWidth(usrInpt->length());
我错过了什么?
答案 0 :(得分:3)
您可以使用QLabel
调整adjustSize()
的大小,但即使如此,QGraphicsProxyWidget
也不会更改其大小,从而导致问题仍然存在,要纠正我们必须覆盖{{1}并且返回适当的大小,除此之外你设置文本的方式不合适,如果你创建一个里面有标签的类,你可以创建一个更新{{1}的boundingRect()
方法无需编写大量代码:
setText()
然后QLabel
方法看起来像这样:
class GraphicsProxyWidget: public QGraphicsProxyWidget{
public:
using QGraphicsProxyWidget::QGraphicsProxyWidget;
QRectF boundingRect() const{
if(widget())
return QRectF(widget()->rect());
return QGraphicsProxyWidget::boundingRect();
}
};
class DiagramItem: public QGraphicsPolygonItem{
QLabel *label;
GraphicsProxyWidget *pMyProxy ;
public:
explicit DiagramItem(DiagramType diagramType, QMenu *contextMenu, QGraphicsItem *parent=nullptr):QGraphicsPolygonItem(parent) {
label = new QLabel;
pMyProxy = new GraphicsProxyWidget(this);
pMyProxy->setWidget(label);
label->setTextInteractionFlags(Qt::TextEditorInteraction);
label->setStyleSheet("QLabel { background-color : red; color : blue; }");
setText("I AM A SQARE DADADA");
...
}
void setText(const QString & text){
label->setText(text);
label->adjustSize();
pMyProxy->setPos(boundingRect().center()-label->rect().center());
}
};
示例:
setItemLabel