2010-03-03 13 views
7

Hy orada,Qt - (? Yavaş rötuş) Çerçevesiz pencereyi taşıma

Ben Qt yeniyim ve ben dragable bir Çerçevesiz pencere, yaratmaya çalışmışlardır. Sorun şu ki, eğer pencereyi hareket ettirirsem .. duracak olana kadar (üzgünüm, ingilizceyi nasıl tarif edeceğimi bilmiyorum) binlerce var. Bunu düzeltmenin bir yolu var mı, yoksa yanlış yolu mu düşünüyorsun?

MyWindow.h

#include <QMainWindow> 
#include <QLabel> 
#include <QPushButton> 
#include <QMouseEvent> 

class MyWindow : public QMainWindow { 
    Q_OBJECT 
private: 
    QLabel *label_title,*label_quit; 
    QPushButton *bn_exit; 
    QPixmap *pixmap; 
    QPoint m_dragPosition; 

public: 
    MyWindow(QMainWindow *parent = 0, Qt::WindowFlags flags = 0); 
protected: 
    void paintEvent(QPaintEvent *event); 
    void mouseMoveEvent(QMouseEvent *event); 
    void mousePressEvent(QMouseEvent *event); 
}; 

MyWindow.cpp

#include "MyWindow.h" 
#include <QApplication> 
#include <QPainter> 
#include <QLabel> 

MyWindow::MyWindow(QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent,flags) { 

    resize(1024,576); 
    setWindowTitle("Versuch1"); 

    //Titel 
    label_title = new QLabel("irgendwas",this); 
    label_title->setGeometry(10,10,500,40); 
    label_title->setStyleSheet("font-family: Arial; letter-spacing: 4px;font-weight:bold; color : white;font-size: 30px"); 

    //Exit-Button 
    bn_exit = new QPushButton("[Exit]",this); 
    bn_exit->setGeometry(975,10,40,20); 
    bn_exit->setStyleSheet("QPushButton {font-family: Verdana; font-size:15px; top:0px; border: none; background-color:#101010; color:white} QPushButton:hover {color: red }"); 
    connect(bn_exit,SIGNAL(clicked()),qApp,SLOT(quit())); 
} 


void MyWindow::paintEvent(QPaintEvent *event) // Painter 
{ 
    QPainter painter(this); 
    painter.setPen(Qt::NoPen); // deactivate Border 

    painter.setBrush(QBrush("#101010")); // black title and footer 
    painter.drawRect(0, 0, 1024, 60); 

    painter.setBrush(QBrush("#101010")); 
    painter.drawRect(0, 516, 1024, 576); 
} 
void MyWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() & Qt::LeftButton) { 
     move(event->globalPos() - m_dragPosition); 
     event->accept(); 
    } 
} 
void MyWindow::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::LeftButton) { 
     m_dragPosition = event->globalPos() - frameGeometry().topLeft(); 
     event->accept(); 
    } 
} 

main.cpp

#include <QApplication> 
#include "MyWindow.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    MyWindow* window = new MyWindow(0, Qt::FramelessWindowHint); 
    window->show(); 
    return app.exec(); 
} 

Selamlar, Alex

Sen b çağırarak denemek isteyebilirsiniz
+0

Örnek kodunuzu Winwods Vista'da Qt 4.5.1 ile denedim ve iyi çalışıyor, daha neyin yanlış olduğunu açıklayabilir misiniz (binlerce ne?). – gregseth

+1

"Binlerce tane" pencere parçalarının büyük bir bölümünü ifade ediyor, pencere yöneticisi, arka plan pencereyi hareket ettirildiğinde düzgün bir şekilde yenilenmiyorsa, arkada bırakabiliyor. Bana göre, pencere yöneticisi veya büyük bir CPU yükü üzerinde çalışan gömülü bir aygıt üzerinde bir sorun gibi geliyor. –

+0

Bu tam olarak ne demek istediğimi. Ama sadece, çerçevesiz pencereyi Firefox gibi bir anoter uygulaması üzerinden çekiyorsam olur. Masaüstünde normal bir davranış. CPU yükü normaldir, ayrıca GPU <% 5 – Alex

cevap

1

Korunan yöntemlerinizde ase sınıf yöntemleri. Ben olayları yeniden boyamak işlemeye çalışırken yaklaşık sorununuzu (Ubuntu veya XP) ama nasıl yeniden olamazdı

void MyWindow::paintEvent(QPaintEvent *event) // Painter 
{ 
    QWidget::paintEvent(event); 
    ... 
} 
void MyWindow::mouseMoveEvent(QMouseEvent *event) 
{ 
    QWidget::moveMouseEvent(event); 
    ... 
} 
0

: Örneğin:

if (event->buttons() & Qt::LeftButton) { 
    move(event->globalPos() - m_dragPosition); 
    event->accept(); 
    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); 
} 

Bu sistem kaynaklarını veya azaldığında olabileceğini senin ekran sürücüsü "yavaş". Temiz bir yeniden başlatma ve sadece uygulamanızın açık olmasını deneyin.