Если имя пользователя не существует в базе данных, это утверждение будет ложным:
while(query.next())
т.е. никакие записи не возвращаются.
Вы строите строки для запросов, но лучше использовать подготовленные запросы. Он не только позаботится о специальных символах в имени пользователя и пароле, но и защитит от атак с использованием инъекций. Я бы перестроил ваш код следующим образом:
void LoginScreen::createClicked()
{
QString username{ui -> newUsernameInput -> text()};
QString password{ui -> newPasswordInput -> text()};
QSqlQuery query(db);
query.prepare("SELECT username FROM users WHERE username = :username");
query.bindValue(":username", username);
bool ok{query.exec()};
if(ok)
{
if (query.next())
{
QString newUsername{query.value("username").toString()};
if(username == newUsername)
{
QMessageBox::information(this, "Error", "Username already exists!");
ui -> newUsernameInput -> clear();
ui -> newPasswordInput -> clear();
}
}
else
{
QSqlQuery query(db);
query.prepare("INSERT INTO users (username, password) VALUES(:username,:password)");
query.bindValue(":username", username);
query.bindValue(":password", password);
query.exec();
}
}
}
Редактировать:
Нет необходимости для этой проверки:
if(username == newUsername)
, потому что вы знать, что к этому моменту имя пользователя уже существует в базе данных.