[Megoldva] Qt: Ablak keret eltüntetése

 ( pelz | 2008. október 15., szerda - 3:07 )

Jelenleg egy dialógus ablak a programom kerete. Úgymond ez a mainframe. Azt szeretném elérni, hogy a programomnak ne legyen kerete, tehát a fölső sáv, amiben az ablak bezáró "x" (close) gombocska megjelenik, ne látszódjon.
Szerintetek van erre mód? Ha igen, hogyan?
Kösz a segítséget!

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Hat, Qt alatt nem tudom hogyan kell, de amit keresel, azt "override redirect"-nek hivja a nativ X konyvtar (lasd alabb, pelda). Ha igy keresel ra' Qt-s doksik kozott?

  XSetWindowAttributes   xwa;            
  Window                 window;
  ...
  window=XCreateWindow(display,...);
  xwa.override_redirect=1;                                                
  XChangeWindowAttributes(display,window,CWOverrideRedirect,&xwa);  
  ...
  XMapWindow(display,window);
  ...

Szerintem a Qt::WindowFlags enumot keresed. Annak vannak Qt::FramelessWindowHint és Qt::CustomizeWindowHint értékei, amivel meg tudod oldani a keret nélküliséget.

QWidget::setWindowFlags(Qt::WindowFlags)
eljárás és
Qt::FramelessWindowHint flag a kívánt hatást produkálja.
Hátulütője, hogy ilyenkor az ablakot nem lehet az egérrel mozgatni,
ahhoz (pár napos thread alapján a levlistán) újra kell implementálni
az egérhez tartozó eseménykezelőket (mouseclick, mousemove, stb.)

Szerk.: examples/widgets/windowflags példát nézegesd, elég hasznos! ;)
--
A gyors gondolat többet ér, mint a gyors mozdulat.

Alt+Balklikkel addig is tudja mozgatni.

Kipróbáltam. Tényleg!

Kösz!

Egy régi projectemben ez így néz ki:

MainWindow::MainWindow()
    : QWidget(0,Qt::FramelessWindowHint),
      m_dragging(false)
{
...
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && event->pos().y()<40)
    {
        m_dragging=true;
        m_lastPos=QCursor::pos();
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent* event)
{
    if (m_dragging && (event->buttons() & Qt::LeftButton))
    {
        move(pos()+QCursor::pos()-m_lastPos);
        m_lastPos=QCursor::pos();
    } else
        m_dragging=false;
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
        m_dragging=false;

}

Ha az ablak felső 40 pixelére kattintasz, akkor tudod húzgálni.
A .h fájlt szerintem ki tudod találni. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Sziasztok!

Köszönöm a segítségeteket! Este kipróbálom a lehetőségeket.

Azt elfelejtettem említeni, hogy Qt3-ban dolgozom éppen!

Ettől függetlenül nagy segítséget jelentettek a hozzászólásaitok, mert ezek alapján már elboldogultam.
Qt3-ban így lehetett megoldani:

MainFrame::MainFrame(QWidget* parent, const char* name)
: QWidget(parent, name, Qt::WStyle_Customize | Qt::WStyle_NoBorder)

Mivel az ablak mozgatására elvileg nincs igény, ezért a "tr3w" által javasolt ablakmozgatási lehetőséget kihagytam a programból.

Kösz még egyszer!

Csak figyelmeztetes: maskor ird oda, mert a ket Qt kozt nem sok atmenet van API-ban, igy adott problemak megoldasa maskepp nez ki Qt3 mint Qt4 alatt.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Illetve felejtsd el a qt3-at. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Nem feltetlen kell elfelejteni, csak szep halkan kell elkezdeni migralni 4-re.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Qt4-ben szoktam programozgatni, de most sajna muszáj elővennem a Qt3-at.