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


Как я понимаю, login и in разные классы. Делай или через сигналы слоты, тогда классы создаются в main или вызывай конструктор одного в другом... тогда сможешь обращаться к его публичным переменным. А так покажи код.. и скажи чего хочешь.
Dimix
Смотреть 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
Тяжело понять. 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
Я раньше писал программы все одним полотном и несталкивался с подобной проблеммой так как мог получить все что понадобится. Но проблемма в том что когда настало время модернизировать ранне созданные проэкты это оказалось весьма непросто так как код имеет более чем 5000 строк я подумал что это неудобно.
Начал куралесить создавая каждое окно отдельными файлами и вот столкнулся с проблеммой что при попытке обращения к переменной вызовом ее в другом файле она оказывается пустой.
Пример создал файл Базы данных заполнил его именами загрузил список имен в combobox и при выборе имени у меня выполняется получение данных для текущего имени его пароль и т.п. нажимаю кнопочку Вход появляется другое окно и говорит введите пароль ввожу пароль и сравниваю его с полученным при выборе имя паролем но проверка не проходит так как переменная хранящяя пароль на этот момент пустая.
silver47
Ну откуда там взяться содержимому, если Вы туда ничего не передаете? Вот кусок Вашего кода с вызовом второго окна:
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("Строка");
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.