Mat*_*zer 2 c++ qt qgraphicsitem qlabel qt5
我有一个以自定义 QGraphicsPolygonItem 为中心的 QLabel,我正在使用 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());
...
Run Code Online (Sandbox Code Playgroud)
这是我用来更改标签文本的插槽:
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);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果,这是在触发上面的插槽之前:
这是触发插槽后我得到的结果:

这条线也没有做任何事情,我不知道为什么:
label->rect().setWidth(usrInpt->length());
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
QLabel您可以调整的大小adjustSize(),但即使这样也QGraphicsProxyWidget不会改变其大小,从而导致问题持续存在,要纠正我们必须覆盖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());
}
};
Run Code Online (Sandbox Code Playgroud)
然后该setItemLabel方法将如下所示:
void MainWindow::setItemLabel(){
if(!scene->selectedItems().isEmpty())
{
auto *item = scene->selectedItems().first();
DiagramItem *it = static_cast<DiagramItem *>(item);
if(it){
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){
it->setText(lt->text())
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
#include <QApplication>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QLabel>
#include <QTimer>
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(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(QString("I AM A SQARE DADADA"));
setBrush(Qt::green);
}
void setText(const QString & text){
label->setText(text);
label->adjustSize();
pMyProxy->setPos(boundingRect().center()-label->rect().center());
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView w;
QGraphicsScene *scene = new QGraphicsScene;
w.setScene(scene);
auto it = new DiagramItem;
QPolygonF myPolygon({QPointF(-120, -80), QPointF(-70, 80),
QPointF(120, 80), QPointF(70, -80),
QPointF(-120, -80)});
it->setPolygon(myPolygon);
scene->addItem(it);
QTimer::singleShot(1000, [it](){
it->setText("some text");
});
w.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2758 次 |
| 最近记录: |