调整QLineEdit的默认宽度

6
我正在尝试编写数独求解器,目前我想实现的是将数独输入到一个9x9的QLineEdit网格中。 该网格由9个QFrame组成,每个QFrame包含一个9个子类化的QLineEdit小部件的网格。
我的问题是,我无法找到一种方法来将QLineEdit小部件的默认大小更改为25px x 25px,而不限制它们的缩放比例(通过设置固定大小)。我已经尝试使用resize()函数和子类化QLineEdit类来重新实现sizeHint(),但我似乎找不到一种调整这些小部件初始宽度的方法。
有人能帮助我吗?
下面是两张图片:第一张是窗口当前的外观,第二张是我希望它出现的方式(即相同的窗口,但在将宽度调整为最小值后)。
这是我的代码: sudokufield.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());
}

mainwindow.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)。 - Martin
我在UI编辑器中没有设置窗口大小(我没有UI文件),也没有使用setSize()方法。我不想为小部件设定固定的大小,我希望QLineEdit初始化为25像素x 25像素的正方形,并向上缩放。 - mr_kazz
2个回答

1
通过使用更广泛的样式表,而不是试图依赖于setMinimumSize()函数,我能够使子类化的QLineEdit小部件以25x25像素的大小显示,而不限制小部件的固定大小。
this->setStyleSheet(QString("border: 1px solid gray; width: 25px; height:25px;"));

0
要获取您的QLineEdit的固定大小,必须将sizePolicy设置为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的章节。


1
我不想要一个固定的大小,我想设置一个初始大小。我尝试通过子类化QLineEdit来获取[sizeHint()],但我认为我肯定做错了什么。这也是您所提到的文章末尾的内容。 - mr_kazz
@mr_kazz 但是您希望单元格始终保持正方形吗? - UmNyobe
@UmNyobe,这并不是我的问题,但那将会很棒! :) - mr_kazz
@mr_kazz,只需阅读答案中的所有链接,您就可以做到想做的一切,并避免不适当使用CSS样式。 - tro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接