Реализации кнопок в Qt / C ++ - PullRequest
0 голосов
/ 09 марта 2020

Я собираюсь реализовать судоку gui в Qt. Перво-наперво я пытаюсь сгенерировать сетку из QToolButtons, которая при нажатии увеличивает их значение на единицу.

Вот мой заголовок для window.h


class Window : public QWidget
{
    Q_OBJECT
public:
    Window(QWidget *parent = nullptr);

private slots:
    void digitClicked();

private:
    Button *createButton(const QString &text, const char *member);
    QString *readFileChar(const QString file_name, QString digit[] );
    QGridLayout *previewLayout;
    void setSudokuChar(const int digit, const char *member);

    enum { NumDigitButtons = 81 };
    Button *digitButtons[NumDigitButtons];
    QString digit[NumDigitButtons];

protected:
    void paintEvent(QPaintEvent *event) override;
    void mouseReleaseEvent(QMouseEvent * event) override;
};

и соответствующего окна исходного файла. cpp


Window::Window(QWidget *parent) : QWidget(parent) //constrcutor
{
   //button creation
   QString* current_digit = readFileChar("/home/pi/Documents/ELEC1204/P6/sudoku.txt", digit);
   for(int i = 0; i < NumDigitButtons; i++){
         digitButtons[i] = createButton(*(current_digit++), SLOT(digitClicked())); //initialize sudoku
   }

   // set form size
   QGridLayout *mainLayout = new QGridLayout;
   setMaximumSize(600,600);
   mainLayout->setSizeConstraint(QLayout::SetFixedSize);
   setWindowTitle(tr("button game"));

   // place each digit button
   for(int i = 1; i < NumDigitButtons; i++){
       int row = (81 - i) / 9 ; // y position for button
       int col = (i - 1) % 9 ;  // x position for button
       mainLayout->addWidget(digitButtons[i], row, col);
   }
}

void Window::digitClicked()
{
   Button *clickedButton = qobject_cast<Button*>(sender()); //clicked button = object button that was pressed
   int val = ++(clickedButton->text().toInt()); //incrememt digit value of the button which was pressed
   setSudokuChar(val, clickedButton); //updates sudoku with new value 
}

QString* Window::readFileChar(const QString file_name, QString digit[]) //reads in file to initialize buttons
{
    QFile file(file_name);
    int i = 0;

    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QTextStream in(&file);
        while(!in.atEnd()){
            digit[i] = in.read(1); //read each character into an array of QStrings 
            i++ ;
        }
    }
    else{
        QTextStream(stdout) << "could not open file, program terminating" << endl;
        exit(1);
    }
    return digit;
}

Button *Window::createButton(const QString &text, const char *member)
{
    Button *button = new Button(text);
    connect(button, SIGNAL(clicked()), this, member);
    return button;
}


void setSudokuChar(const int digit, Button* clickedButton) //takes in a digit, and assigns its value to the char that was pass
{

}

Обратите внимание, что функция обновления Значение кнопки при нажатии 'setSudokuChar' еще не реализовано, но на данный момент это довольно неактуально.

Вот заголовок класса кнопки button.h, это всего лишь небольшая модификация класса QToolButton для помощи в изменении размера.

class Button : public QToolButton
{
    Q_OBJECT

public:
    explicit Button(const QString &text, QWidget *parent = nullptr);

    QSize sizeHint() const override;
};

И, наконец, вот кнопка. cpp исходный файл

Button::Button(const QString &text, QWidget *parent) : QToolButton(parent)
{
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
    setText(text);
}

QSize Button::sizeHint() const
{
    QSize size = QToolButton::sizeHint();
    size.rheight() += 20;
    size.rwidth() = qMax(size.width(), size.height());
    return size;
}

Надеюсь, это не слишком много, чтобы переварить, я все еще новичок!

** Моя проблема в том, что ... ** когда я запускаю код, создается окно, но оно пустое, что означает, что с компиляцией все в порядке, но программа работает не так, как задумано. Может ли кто-нибудь случайно заметить, что идет не так? Все, что я делаю в основной функции, это создаю окно следующим образом:

int main(int argc, char *argv[])
{   
    QApplication app(argc, argv);

    Window window;
    window.show();
    return app.exec();
}

Любая помощь полностью оценена.

...