Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Переменные

Автор: Dimix 14.1.2011, 6:43

Создал GUI приложение Qt с названием login
Создал Класс формы Qt Desinger с названием in
В login есть переменные типа QString
Пытаюсь присвоить данные полученные в QString форме in Но QString у меня почемуто ничего не содержит
Debug показывает что QString данные получает а когда пытается передать он очищается.
Как решить эту проблемку?

Автор: Dovgon 14.1.2011, 7:33

покажи исходники, так тебе не кто не поможет.

Автор: silver47 14.1.2011, 8:17

Цитата(Dimix @ 14.1.2011, 8:43) *
Создал GUI приложение Qt с названием login
Создал Класс формы Qt Desinger с названием in
В login есть переменные типа QString
Пытаюсь присвоить данные полученные в QString форме in Но QString у меня почемуто ничего не содержит
Debug показывает что QString данные получает а когда пытается передать он очищается.
Как решить эту проблемку?


Как я понимаю, login и in разные классы. Делай или через сигналы слоты, тогда классы создаются в main или вызывай конструктор одного в другом... тогда сможешь обращаться к его публичным переменным. А так покажи код.. и скажи чего хочешь.

Автор: Dimix 14.1.2011, 14:58

Смотреть getUserData();

Раскрывающийся текст
#include "loginwin.h"
#include "ui_loginwin.h"
#include "passwordwin.h"
#include "ui_passwordwin.h"

#include "create.h"
#include "ui_create.h"

loginWin::loginWin(QWidget *parent) :
QDialog(parent),
ui(new Ui::loginWin)
{
ui->setupUi(this);
loadUser();

warningError="Ошибка";
criticalError="Критическая ошибка";
userErrorConnection="Ошибка осуществления соединения с пользовательской базой данных";
userNotFiledb="Ошибка файл пользовательской базы данных не найден";
mainErrorConnection="Ошибка осуществления соединения с главной базой данных";
mainNotFiledb="Ошибка файл главной базы данных не найден";
getUserData();
}

loginWin::~loginWin()
{
delete ui;
}
void loginWin::getUserData()
{
QFile file;
if(file.exists("bin\\"+ui->cboAccount->itemText(ui->cboAccount->currentIndex()))){
if(file.exists("profile\\account")){
QSqlDatabase maindb = QSqlDatabase::addDatabase("QSQLITE");
maindb.setHostName("localhost");
maindb.setDatabaseName("profile\\account");
if(!maindb.open("user", "password")){
maindb.lastError().text();
QSqlDatabase::removeDatabase("QSQLITE");
QMessageBox::warning(this, warningError, mainErrorConnection);
}else{
QSqlQueryModel model;
model.setQuery("SELECT * FROM user WHERE name = '"+ui->cboAccount->itemText(ui->cboAccount->currentIndex())+"';");
for(int i = 0; i < model.rowCount(); ++i){
userCurrency=model.record(i).value("currency").toString();
userName=model.record(i).value("name").toString();
userPassword=model.record(i).value("password").toString();
userPass=model.record(i).value("pass").toString();
userPin=model.record(i).value("pin").toString();
userSound=model.record(i).value("sound").toString();
}
model.clear();
maindb.close();
QSqlDatabase::removeDatabase("QSQLITE");
};
}else{
QMessageBox::critical(this, criticalError, mainNotFiledb);
};
}else{
QMessageBox::critical(this, criticalError, userNotFiledb);
};
}
void loginWin::on_cboAccount_currentIndexChanged(QString )
{
getUserData();
}
void loginWin::on_buttonLogin_clicked()
{
if(ui->cboAccount->currentIndex()==0){
QMessageBox::warning(this, warningError, tr("Вы не выбрали учетную запись"));
}else{
PasswordWin* paq = new PasswordWin;
paq->show();

close();
};
}
Раскрывающийся текст
#include "passwordwin.h"
#include "ui_passwordwin.h"
#include "loginwin.h"
#include "ui_loginwin.h"

PasswordWin::PasswordWin(QWidget *parent) :
QDialog(parent),
ui(new Ui::PasswordWin)
{
ui->setupUi(this);
loginWin* log = new loginWin;
ui->labelMore->setText(tr("<b><center>Для доступа к учетной записи")+log->userName+tr("</center></b>"));//возникшая проблема здесь
}

Автор: silver47 14.1.2011, 18:20

Тяжело понять. SQLite не поддерживает пароли и её содержимое не составит труда прочитать. Что нужно передать из одного класса в другой? Вы пытаетесь сделать окно логина?

Я проверяю наличие базы данных так:

if(!query.exec("SELECT * FROM sometable LIMIT 1")) {
    // базы данных нет или нет такой таблицы
}


А окно логина в первой своей программе делал по здешнему совету как-то так:
main.cpp
#include "login.h"
#include "mainwindow.h"
..
login             loginWindow;
mainwindow  main;

loginWindow.show();

QObject::connect(loginWindow, SIGNAL(GO(const QString &someString)), main, SLOT(GO(const QString &someString)));
// сигнал в логине и слот в main
// Сейчас бы сделал по-другому

Автор: Dimix 14.1.2011, 18:44

Я раньше писал программы все одним полотном и несталкивался с подобной проблеммой так как мог получить все что понадобится. Но проблемма в том что когда настало время модернизировать ранне созданные проэкты это оказалось весьма непросто так как код имеет более чем 5000 строк я подумал что это неудобно.
Начал куралесить создавая каждое окно отдельными файлами и вот столкнулся с проблеммой что при попытке обращения к переменной вызовом ее в другом файле она оказывается пустой.
Пример создал файл Базы данных заполнил его именами загрузил список имен в combobox и при выборе имени у меня выполняется получение данных для текущего имени его пароль и т.п. нажимаю кнопочку Вход появляется другое окно и говорит введите пароль ввожу пароль и сравниваю его с полученным при выборе имя паролем но проверка не проходит так как переменная хранящяя пароль на этот момент пустая.

Автор: silver47 14.1.2011, 19:09

Ну откуда там взяться содержимому, если Вы туда ничего не передаете? Вот кусок Вашего кода с вызовом второго окна:

QMessageBox::warning(this, warningError, tr("Вы не выбрали учетную запись"));
}else{
PasswordWin* paq = new PasswordWin; // создаем второе окно
paq->show(); // показываем его


Раз уж Вы создали второе окно, то передать в него строку вы можете 2 способами (насколько я, как быдлокодер знаю):
1 - не совсем трушный - прямой записью в публичную переменную класса:
PasswordWin.h
class PasswordWin : public ..........
{
    Q_OBJECT

private:
    // приватные переменные

public:
   // публичные переменные
  QString myVeryNeededString;
};


тогда до вызова paq->show; нужно будет paq->myVeryNeededString = "Строка";

2 - Более трушный, переменную запихнуть в приват, а в паблике создать функцию по работе со строкой:

PasswordWin.h
class PasswordWin : public ..........
{
    Q_OBJECT

private:
    // приватные переменные
   QString myVeryNeededString;

public:
   // публичные переменные
  void setMyVeryNeededString(const &QString);
};


PasswordWin.cpp
..
void PasswordWin::setMyVeryNeededString(const QString &str){
  myVeryNeededString = str;
}
..


тогда перед вызовом paq->show(); нужно будет выполнить paq->setMyVeryNeededString("Строка");

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)