Почему QFontMetrics возвращает прямоугольник с обрезанной шириной в Windows 7?
Я рисую текст в подклассах меню. А также QFontMetrics
вернуть прямоугольник с обрезанной шириной. Это происходит в Windows 7. Но это работает, как я ожидаю, в Debian с KDE. Почему это происходит и как я могу это исправить?
class MainMenuBar : public QMenuBar
{
public:
explicit MainMenuBar(QWidget *parent = 0);
protected:
virtual void paintEvent(QPaintEvent *event);
private:
QFont _font;
};
MainMenuBar::MainMenuBar(QWidget *parent) : QMenuBar(parent)
{
_font = font();
}
void MainMenuBar::paintEvent(QPaintEvent *event)
{
QMenuBar::paintEvent(event);
QPainter painter(this);
painter.setFont(_font);
QRect rect = geometry();
rect.setRight(200);
rect.setLeft(rect.right() - QFontMetrics(_font).width("WWW")); // Cuts
//rect.setLeft(rect.right() - QFontMetrics(font()).width("WWW")); // Doesn't cut
painter.drawText(rect, Qt::AlignVCenter, "WWW");
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setMenuBar(new MainMenuBar(this));
menuBar()->addAction(".");
}
1 ответ
В подобной ситуации я бы не стал так ограничивать текст. Просто выделите прямоугольник как можно дольше (лучше) или, возможно, чтобы он соответствовал 4 Вт (не так хорошо).
painter.drawText(rect, Qt::AlignVCenter | Qt::AlignRight, "WWW");
А также Qt::AlignRight
сделает свое дело. Не знаю, почему рендеринг немного отличается. Если вы уточните свою задачу, мы сможем предложить лучший подход.
Лучшей практикой будет даже не это, а QVBoxLayout для всего окна и QHBoxLayout для верхнего виджета с помощью 'stretch' (здесь вы не уверены, хотите ли вы просто выровнять текст по правому краю или сделать растяжку с фиксированной шириной по левому краю перед ним?) На левый плюс QLabel добавлен в качестве виджета (возможно, с правым выравниванием). Но вы не спрашиваете об этом, и я могу только предположить, что вы не пробовали лучший макет.