Qt - edycja, obsługa zdarzeń, rozmieszczenie kontrolek Bogdan Kreczmer ZPCiR ICT PWR pokój 307 budynek C3 kreczmer@ict.pwr.wroc.pl Copyright c 2003 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępiony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z ninijeszą stroną tytułową.
Tekstowe okno edycyjne (cz. 1) Podstawowe własności okienka edycyjnego ( klasa QLineEdit): Możliwość pracy w trzech trybach (setmode): z echem (QLineEdit::Normal), bez echa (QLineEdit::NoEcho), hasło (QLineEdit: Przemieszanie kursora (home, end, cursorleft, setcursorposition, cursorwordforward), Zaznaczanie tekstu (setselection), Operacje na clipboard zie (copy, cut, paste), Sprawdzanie poprawności wprowadzonego tekstu (validateandset), Sygnały: zmiana tekstu (textchanged), naciśnięcie klawisza ENTER lub RETURN (returnpressed), Sloty: wstawianie ciągu znaków (settext, insert), selekcja i deselekcja (selectall, deselect), kasowanie (clear), usunięcie funkcji zatwierdzającej (clearvalidator).
Tekstowe okno edycyjne (cz. 2) class GlowneOkno : public QWidget Q_OBJECT public: QLabel _ProbkaTekstu; QLineEdit _OknoEdycyjne; GlowneOkno( QWidget rodzic=0, const char nazwa=0 ); public slots : void WezTekst(); void ZmienMod(); ;
Tekstowe okno edycyjne (cz. 3) void GlowneOkno::WezTekst() _ProbkaTekstu- settext(_oknoedycyjne- text()); void GlowneOkno::ZmienMod() char Tekst; int Dlugosc; QLineEdit::EchoMode Mod; switch ( _OknoEdycyjne- echomode() ) case QLineEdit::Normal: Tekst = "Mod: NoEcho"; Mod = QLineEdit::NoEcho; Dlugosc = 28; break ; case QLineEdit::NoEcho: Tekst = "Mod: Password"; Mod = QLineEdit::Password; Dlugosc = 8; break ; case QLineEdit::Password: Tekst = "Mod: Normal"; Mod = QLineEdit::Normal; Dlugosc = 32767; _OknoEdycyjne- setechomode(mod); _OknoEdycyjne- setmaxlength(dlugosc); _OknoEdycyjne- settext(); _ProbkaTekstu- settext(tekst); GlowneOkno::GlowneOkno( QWidget rodzic=0, const char nazwa=0 ) setgeometry(100,100,400,120); _ProbkaTekstu = new QLabel(" Mod domyślny: Normal ",this ); _ProbkaTekstu- setgeometry(40,5,190,30); _OknoEdycyjne = new QLineEdit(this ); _OknoEdycyjne- setgeometry(35,40,190,30); connect(_oknoedycyjne,signal(returnpressed()),this,slot(weztekst())); QPushButton Przycisk = new QPushButton("Zmień mod", this ); Przycisk- setgeometry(40,75,120,30); connect(przycisk,signal(clicked()),this,slot(zmienmod()));
Tekstowe okno edycyjne (cz. 4) void GlowneOkno::przeniesTekst() _ProbkaTekstu- settext(_zrooknoed- text()); _DocOknoEd- home(false); _ZroOknoEd- cut(); _DocOknoEd- paste(); void GlowneOkno::kasujZnak() _ZroOknoEd- del(); GlowneOkno::GlowneOkno( QWidget rodzic=0, const char nazwa=0 ) setgeometry(100,125,350,150); _ProbkaTekstu = new QLabel("Tu znajdze się tekst z okienka.",this ); _ProbkaTekstu- setgeometry(40,5,220,30); _ZroOknoEd = new QLineEdit(this ); _ZroOknoEd- setgeometry(35,40,190,30); connect(_zrooknoed,signal(returnpressed()),this,slot(przeniestekst())); _DocOknoEd = new QLineEdit(this ); _DocOknoEd- setgeometry(35,80,190,30); _DocOknoEd- setframe(false); _DocOknoEd- setreadonly(true); connect(_docoknoed,signal(returnpressed()),_docoknoed,slot(clear())); QPushButton Przycisk = new QPushButton("Przenies", this ); Przycisk- setgeometry(25,115,100,30); connect(przycisk,signal(clicked()),this,slot(przeniestekst())); Przycisk = new QPushButton("Kasuj", this ); Przycisk- setgeometry(135,115,100,30); connect(przycisk,signal(clicked()),this,slot(kasujznak()));
Wielowierszowe tekstowe okno edytora Podstawowe własności okna edytora ( klasa QMultiLineEdit): Możliwość pracy w trzech trybach (setmode): z echem (QLineEdit::Normal), bez echa (QLineEdit::NoEcho), hasło (QLineEdit: Przemieszanie kursora (home, end, cursorleft, setcursorposition, cursorwordforward), Zaznaczanie tekstu (setselection), Operacje na clipboard zie (copy, cut, paste), Sprawdzanie poprawności wprowadzonego tekstu (validateandset), Możliwość łamania słów (setwrappolicy), Operacje undo i redo, Operacja na liniach tekstu (insertline, removeline), Sygnały: zmiana tekstu (textchanged), naciśnięcie klawisza ENTER lub RETURN (returnpressed), osigalność operacji kopiowania (copyavailable), undo i redo, Sloty: wstawianie ciągu znaków (settext, insert), selekcja i deselekcja (selectall, deselect), kasowanie (clear), usunięcie funkcji zatwierdzającej (clearvalidator), kopiowanie tekstu kodowanego (pastesubtype).
Obsługa zdarzeń z klawiatury (cz. 1) program.h class GlowneOkno : public QMultiLineEdit Q_OBJECT void keypressevent(qkeyevent ); public: GlowneOkno( QWidget rodzic=0, const char nazwa=0 ); ; program.cpp
void GlowneOkno::keyPressEvent(QKeyEvent int NumLi,NumKo; QString Linia; wstanklaw) if (wstanklaw- state() == Qt::ControlButton) switch (wstanklaw- key()) case Qt::Key_Y: paste(); return ; case Qt::Key_T: getcursorposition(&numli,&numko); if (((Linia = textline(numli)).length() 2) (NumKo 1)) return ; if (Linia.length() = NumKo) setcursorposition(numli, NumKo); del(); backspace(); insertchar(linia[numko]); insertchar(linia[numko-1]); return ; case Qt::Key_U: undo(); return ; QMultiLineEdit::keyPressEvent(wStanKlaw); GlowneOkno::GlowneOkno( QWidget rodzic=0, const char nazwa=0 ) setgeometry(100,125,350,100);
Wykorzystanie Clipboard u program.h class OknoListy : public QWidget Q_OBJECT QListBox _Lista; public: OknoListy( QWidget rodzic, const char PLs, const char nazwa=0 ); public slots : void wstawdolisty(); void kopiujzlisty(const QString &Napis); ; class GlowneOkno : public QWidget Q_OBJECT public: GlowneOkno( QWidget rodzic=0, const char nazwa=0 ); ; program.cpp
void OknoListy::wstawDoListy() QString Tekst = QApplication::clipboard()- if (!Tekst.isNull()) _Lista- insertitem(tekst); return ; text(); void OknoListy::kopiujZListy(const QString &Napis) if (!Napis.isNull()) QApplication::clipboard()- settext(napis); return ; OknoListy::OknoListy(QWidget rodzic, const char PozLs, const char nazwa=0): QWidget(rodzic,nazwa) resize(150,300); _Lista = new QListBox(this ); _Lista- setgeometry( 5, 50, 145, 145); _Lista- insertitem(pozls); _Lista- insertitem(qpixmap("../xpm/door1.xpm")); connect(_lista,signal(highlighted(const QString&)),this,SLOT(kopiujZListy(const QString&))); QPushButton Przycisk = new QPushButton("Wstaw",this ); Przycisk- setgeometry(5,5,145,30); connect(przycisk,signal(clicked()),this,slot(wstawdolisty())); GlowneOkno::GlowneOkno( QWidget rodzic=0, const char nazwa=0 ) setgeometry(100,125,485,200); (new OknoListy(this,"Pozycja w liście 1."))- move(5,5); (new OknoListy(this,"Pozycja w liście 2."))- move(165,5); (new OknoListy(this,"Pozycja w liście 3."))- move(320,5);
Tworzenie rozkładu obiektów (cz. 1) GlowneOkno::GlowneOkno( QWidget Rodzic=0, const char Nazwa=0 ) setgeometry(100,100,400,100); QPushButton wprzycisk1 = new QPushButton("Przycisk 1",this ); wprzycisk1- setminimumsize(150,30); QPushButton wprzycisk2 = new QPushButton("Przycisk 2",this ); wprzycisk2- setminimumsize(150,30); QHBoxLayout wukladhor = new QHBoxLayout(this ); wukladhor- addwidget(wprzycisk1); wukladhor- addwidget(wprzycisk2);
Tworzenie rozkładu obiektów (cz. 2) GlowneOkno::GlowneOkno( QWidget Rodzic=0, const char Nazwa=0 ) setgeometry(100,100,400,100); QPushButton wprzycisk1 = new QPushButton("Przycisk 1",this ); wprzycisk1- setminimumsize(150,30); QPushButton wprzycisk2 = new QPushButton("Przycisk 2",this ); wprzycisk2- setminimumsize(150,30); QHBoxLayout wukladhor1 = new QHBoxLayout(); wukladhor1- addwidget(wprzycisk1); wukladhor1- addwidget(wprzycisk2); QPushButton wprzycisk3 = new QPushButton("Przycisk 3",this ); wprzycisk3- setminimumsize(80,30); QPushButton wprzycisk4 = new QPushButton("Przycisk 4",this ); wprzycisk4- setminimumsize(120,30); QPushButton wprzycisk5 = new QPushButton("Przycisk 5",this ); wprzycisk5- setminimumsize(120,30); QHBoxLayout wukladhor2 = new QHBoxLayout(); wukladhor2- addwidget(wprzycisk3); wukladhor2- addwidget(wprzycisk4); wukladhor2- addwidget(wprzycisk5); QVBoxLayout wukladwer = new QVBoxLayout(this ); wukladwer- addlayout(wukladhor1); wukladwer- addlayout(wukladhor2);
Tworzenie rozkładu obiektów (cz. 3) #define KOL_ETYKIETY 0 #define KOL_EDYTOR1W 1 #define KOL_EDYTORWW 2 GlowneOkno::GlowneOkno( QWidget Rodzic=0, const char Nazwa=0 ) setgeometry(100, 100, 400, 100); QGridLayout wkrata = new QGridLayout(this,0,0,10); for ( int wiersz = 0; wiersz 3; wiersz++) QLineEdit wedyt1w = new QLineEdit(this ); wkrata- addwidget(wedyt1w, wiersz, KOL_EDYTOR1W); QString Napis; Napis.sprintf("Wiersz &%i",wiersz+1); QLabel wetykieta = new QLabel(Napis,this ); wkrata- addwidget(wetykieta, wiersz, KOL_ETYKIETY); wetykieta- setbuddy(wedyt1w); QMultiLineEdit weditww = new QMultiLineEdit(this ); wkrata- addmulticellwidget(weditww, 0, -1, KOL_EDYTORWW, KOL_EDYTORWW); wkrata- setcolstretch(kol_edytor1w, 12); wkrata- setcolstretch(kol_edytorww, 23);