Qt:如何在QVBoxLayout中实现QTextEdit控件的左右交替对齐
原代码失效的核心原因
你之前的写法达不到预期效果,本质是混淆了布局全局对齐和单个控件对齐的作用范围:
- 调用
lt->setAlignment()是给整个垂直布局下的所有子控件设置统一对齐规则,不对刚添加的某一个QTextEdit单独生效 - 循环里反复修改全局对齐值,最后一轮循环(i=4,偶数)设置的左对齐会完全覆盖之前所有的对齐配置,最终表现就是所有控件统一左对齐,没有交替效果
可直接运行的正确实现
Qt 的垂直布局添加控件时,支持在addWidget方法中为单个子控件指定专属的对齐规则,不需要改动全局布局的对齐属性,只要按照循环索引的奇偶性传参即可:
QVBoxLayout *lt = new QVBoxLayout; for(int i = 0; i < 5; i++) { QTextEdit *textEdit = new QTextEdit; textEdit->setText("Hello world ! " + QString::number(i)); textEdit->setMaximumSize(100, 30); // 奇数索引右对齐,偶数索引左对齐 if(i % 2 == 1) { lt->addWidget(textEdit, 0, Qt::AlignRight); } else { lt->addWidget(textEdit, 0, Qt::AlignLeft); } } setLayout(lt);
注意事项
- 不要对整个QVBoxLayout调用全局
setAlignment()方法,全局对齐设置会覆盖所有子控件的单独对齐配置 - 因为你给QTextEdit设置了固定的最大宽度,垂直布局会在每个控件所在的垂直行内留出剩余空间,左右对齐才会有可见的效果
等效备选写法:添加完控件后,取当前控件对应的布局项单独设置对齐,效果和上面的写法完全一致
lt->addWidget(textEdit); // 获取刚添加的控件对应的布局项 QLayoutItem *currentItem = lt->itemAt(lt->count() - 1); currentItem->setAlignment(i % 2 ? Qt::AlignRight : Qt::AlignLeft);
内容的提问来源于stack exchange,提问作者Timothée
相关产品推荐
相关产品推荐

