QLabel在更改文本后没有调整大小

时间:2018-04-18 23:31:24

标签: c++ qt qt5 qgraphicsitem qlabel

我有一个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);
                }
            }
        }
    }
}

这是我得到的结果,这是在触发上面的插槽之前: BeforeSlotTriggere 这是我在触发插槽后得到的内容: AfterSlotTriggered

这条线也没有做任何事情,我不明白为什么:

label->rect().setWidth(usrInpt->length());

我错过了什么?

1 个答案:

答案 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

enter image description here

enter image description here