调整QLineEdit的默认宽度

时间:2014-08-24 13:43:27

标签: c++ qt qlineedit

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

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

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

任何可以帮助我的人?​​

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

Current way the window appears Desired way in which the window would appear
这是我的代码: 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");
}

2 个答案:

答案 0 :(得分:0)

要获得QLineEdit的固定大小,您必须为sizePolicyQLineEdit设置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 :(得分:0)

通过使用更广泛的样式表而不是尝试依赖setMinimumSize()函数,我能够使子类化QLineEdit窗口小部件以25 x 25像素的大小显示,而不会将窗口小部件限制为一个固定的大小。

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