【问题标题】:Adjusting QLineEdit's default width调整 QLineEdit 的默认宽度
【发布时间】:2014-10-17 19:13:50
【问题描述】:

我正在尝试编写数独求解器,我目前正在尝试实现的是将数独输入到 9 x 9 QLineEdit 字段的网格中。

网格是使用 9 个QFrames 的网格构建的,每个网格包含 9 个子类 QLineEdit 小部件的网格。

我面临的问题是,我找不到将QLineEdit 小部件的默认大小更改为 25 x 25 像素的方法,而无需通过设置固定大小来限制它们的缩放。我尝试了resize() 函数并将QLineEdit 类子类化以重新实现sizeHint(),但我似乎找不到调整这些小部件初始宽度的方法。

谁能帮帮我?

下面是 2 张图片:第一张是当前显示的窗口,第二张是我希望它显示的样子(= 相同的窗口,但在将宽度调整到最小之后)。


这是我的代码: 数独场.h

#ifndef SUDOKUFIELD_H
#define SUDOKUFIELD_H
#include <QLineEdit>

class SudokuField : public QLineEdit
{
    Q_OBJECT
public:
    explicit SudokuField(QWidget *parent = 0);
    QSize sizeHint();
};

#endif // SUDOKUFIELD_H

sudokufield.cpp

#include <QtGui>
#include "sudokufield.h"
SudokuField::SudokuField(QWidget *parent) :
    QLineEdit(parent)
{
    setMinimumSize(25, 25);
    setFrame(false);
    setStyleSheet(QString("border: 1px solid gray"));
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    setValidator(new QIntValidator(1,9,this));
    //resize(25,25);
}

QSize SudokuField::sizeHint(){
    return QSize(minimumWidth(), minimumHeight());
}

主窗口.cpp

#include <QtGui>
#include "mainwindow.h"
#include "sudokufield.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QGridLayout *fullGrid = new QGridLayout;
    fullGrid->setSpacing(0);

    //construct 9 big boxes
    for(int row(0); row < 3; row++)
        for(int column(0); column < 3; column++) {
            QFrame *boxFrame = new QFrame(this);
            boxFrame->setFrameStyle(QFrame::Box);
            boxFrame->setLineWidth(1);

            QGridLayout *boxGrid = new QGridLayout;
            boxGrid->setMargin(0);
            boxGrid->setSpacing(0);

            //put 9 subclassed QLineEdit widgets in each box
            for(int boxRow(0); boxRow < 3; boxRow++)
                for(int boxColumn(0); boxColumn < 3; boxColumn++){
                    SudokuField *field = new SudokuField(this);
                    boxGrid->addWidget(field, boxRow, boxColumn);
                }
            boxFrame->setLayout(boxGrid);
            fullGrid->addWidget(boxFrame, row, column);
        }

    //add another 1px outer border
    QFrame *fullFrame = new QFrame(this);
    fullFrame->setLineWidth(1);
    fullFrame->setLayout(fullGrid);

    setCentralWidget(fullFrame);
    setWindowTitle("Sudoku");
}

【问题讨论】:

  • 您好,如果您的主窗口看起来像一个矩形,可能是因为您在某处留下了 setSize() 或者它是您在 Ui 中定义的大小。如何使用QWidget::setFixedSize(...) 做你想做的事。为避免主窗口大小调整问题,您应该在每一侧添加一些间隔 (QSpacerItem)。
  • 我没有在 ui 编辑器中设置窗口大小(我没有 ui 文件),也没有使用 setSize() 方法。我不想要小部件的固定大小,我希望 QLineEdits 初始化为 25px x 25px 正方形并向上缩放

标签: c++ qt qlineedit


【解决方案1】:

通过使用更广泛的样式表而不是尝试依赖 setMinimumSize() 函数,我能够让子类化的 QLineEdit 小部件以 25 x 25 像素的大小出现,而无需将小部件限制为固定大小。

this->setStyleSheet(QString("border: 1px solid gray; width: 25px; height:25px;"));

【讨论】:

    【解决方案2】:

    要获得QLineEdit 的固定大小,您必须将QLineEditsizePolicy 设置为QSizePolicy::Fixed,因此QWidget::sizeHint() 是唯一可接受的替代方案,因此小部件永远不会增长或缩小(例如按钮的垂直方向).

    看看sizePolicy的所有变体:http://qt-project.org/doc/qt-5/qsizepolicy.html#Policy-enum

    另外,看看 Jasmin Blanchette 和 Mark Summerfield C++ GUI Programming with Qt4 及其关于 Layout Management 的部分非常有用且写得很好。

    【讨论】:

    • 我不想要一个固定的大小,我想设置一个初始大小。我尝试将 QLineEdit 子类化以控制 [sizeHint()],但我认为我一定做错了什么。这也是你提到的文章末尾的内容。
    • @mr_kazz 但您是否希望单元格始终保持方形?
    • @UmNyobe 这不是我的问题,但那太好了! :)
    • @mr_kazz,只需阅读答案中的所有链接,您就可以为所欲为,并避免不当使用 css 样式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-10-15
    • 2012-07-15
    • 1970-01-01
    • 2013-07-24
    • 2015-01-09
    • 2023-03-07
    相关资源
    最近更新 更多