Автор Тема: Qt4 въпросче за указатели  (Прочетена 1443 пъти)

Jivoder

  • Напреднали
  • *****
  • Публикации: 15
    • Профил
Qt4 въпросче за указатели
« -: Sep 10, 2008, 22:38 »
Да въведа на бързо
php няма проблем всичко е 6 (т.е. пишем без проблем само Kwrite
да има или vi или mcedit макар че най си ми харесва Quanta)
но скоро (преди седмица) реших да разгледам С++
и (има някой общи неща с  php ) но като цяло нищо  '<img'>
викам си кой графичен редактор да ползвам за да облекча страданието от преминаването от php към с++
и се спрях на QT4 рекох щом има 3 и 4 по добре по новото
но бях много учуден как така едно работи в конзолата и същото не работи в QT4  ето за какво иде реч
Примерен код

#include <string>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
using namespace std;
int main(void) {
char* usra;
usra=getlogin();
cout << usra << endl;
return 0;
}


в конзолата всичко е 6 но какво става ако поставя нещо подоно във функция на QT4  (става дума за просто елементарно приложение една textLine и един бутон)

ето и кода на функцията
Примерен код

#include "mainwindowimpl.h"
#include <QFileDialog>
#include <iostream>
//
#include <string>
#include <unistd.h>
#include <sys/types.h>

MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f)
   : QMainWindow(parent, f)
{
   setupUi(this);
   connect(myButton, SIGNAL(clicked()), this, SLOT(klikClicked()));
}

void MainWindowImpl::klikClicked()
{
   char* usra;
   usra=getlogin();
   QString muu;
   muu.append(usra);//te tuka e problema
   pathLine->setText(muu); // сетваме текста
}


ммм тук проблема както и да го въртях не можах да вкарам usra в QString  или да го направя в char който да е удобен за ползване изобщо  а интересно също така че когато се обръщам към променливата за да  взема стойноста от адреса който съдържа приложението гърми (самозатваря се) на пример *usra ако опитам да го ползвам  да не говорим за инкремент като *usra++ докато в конзолата както и да го въртя няма проблем.


Въпроса ми е как правилно да навра usra в QString muu ?

п.с.
    Дано съм бил достатъчно изчепателен  ако някой се сеща какъв точно ми е проблема между конзолата и QT4 ще се радвам да сподели.

//упс май сбърках раздела май е за напреднали



Активен

Jivoder

  • Напреднали
  • *****
  • Публикации: 15
    • Профил
Qt4 въпросче за указатели
« Отговор #1 -: Sep 14, 2008, 10:34 »
Никой ли не прави графични програми с QT ?
Активен

dvasilev

  • Напреднали
  • *****
  • Публикации: 200
  • Distribution: Kubuntu, Debian
  • Window Manager: KDE
    • Профил
    • WWW
Qt4 въпросче за указатели
« Отговор #2 -: Sep 14, 2008, 17:23 »
Ако питаш мен, проблемът не ти е в конвертирането към QString, а някъде другаде. За да се убедиш в това, пробвай следния пример, който е аналог на твоя първи пример:
Примерен код

#include <QString>
#include <unistd.h>
#include <sys/types.h>

int main(void) {
   QString usra(getlogin());
   printf(usra.toLatin1());
   printf("\n");
   return 0;
}

Ако си дадеш целия изходен код на програмката си, която прави проблем, бих могъл да отделя време да ти кажа, къде се дънят нещата.
Активен

kolio_kolev

  • Напреднали
  • *****
  • Публикации: 356
  • Distribution: Mandriva 2011, Mandriva Cooker
  • Window Manager: KDE 4.6.x
    • Профил
    • WWW
Qt4 въпросче за указатели
« Отговор #3 -: Sep 17, 2008, 15:17 »
getlogin() ще работи само на *NIX/Linux системи. Ако ползваш QT + MinGW (Windows), то горния код, например, няма да се компилира (за да се увериш, че нямаш дефинирана  getlogin, то изпълни FINDSTR /s /i getlogin C:\MinGW\*.h, където C:\MinGW е директорията ти с MinGW ).
Ако искаш да правиш мултиплатформено приложение (а точно в това е силата на QT), то търси "QT начина" за решаването на дадения проблем или ползвай мултиплатформени библиотеки. Eдно просто решение на задачата за разбиране на името на текущия потребител само с QT е да се прочете каква стойност има променливата от средата USERNAME.
(за информация, командата su под Linux записва текущия потребител в USER, а не в USERNAME).

Примерен код
#include <QtGui>
//

int main(int argc, char ** argv)
{
   QApplication app( argc, argv );
   
   QStringList env = QProcess::systemEnvironment();
   QString usr = QVariant(env.filter("USERNAME", Qt::CaseInsensitive )).toString();
   usr.replace("USERNAME=", "");
   //qDebug() << "USERNAME=" << usr;

   QWidget *mainWin = new QWidget;
   QLineEdit *pathLine = new QLineEdit(mainWin);
   pathLine->setText(usr);
   mainWin->resize(400,400);
   mainWin->show();
   
   app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
   return app.exec();
};


Горното набързо надраскано примерче със сигурност работи върху Windows и Linux, за MAC не съм тествал. Можеш да разшириш примера, като тестваш каква е текущата платформа и изпълняваш съответния код, специфичен за нея (Q_WS_WIN, Q_WS_X11, Q_WS_MAC, ...)
Примерен код
#ifdef Q_WS_X11
        // Linux/BSD/*NIX
             ...
#else
             ...
#endif


Тогава можеш с QProcess да изпълниш външна команда, специфична за дадената ОС (като whoami в Linux например) и да прихванеш изхода от процеса/командата.

Успех!



Активен

Кольо Колев
Mandriva BG: http://mandriva.biotronica.net
Bitronica.Net форуми: http://forum.biotronica.net

Jivoder

  • Напреднали
  • *****
  • Публикации: 15
    • Профил
Qt4 въпросче за указатели
« Отговор #4 -: Sep 18, 2008, 09:02 »
Благодаря на dvasilev и kolio_kolev
ще тествам след няколко дни че сега нямам време да умра но ще ми бъде от полза   '<img'>
Активен