4

次の特性を持つ Qt でトップレベル ウィンドウを作成するのを手伝っていただければ幸いです。ウィンドウは次の条件を満たしている必要があります。

  1. ボーダレス、タイトルレス、デスクトップ上の他のすべてのウィンドウの上に横たわる (簡単)
  2. その中のどこでもクリックしてドラッグすることでドラッグできます(これは私が助けを必要としているものです)
  3. ドラッグ中はデスクトップの上端に制限されます (比較的簡単です)。

基本的に、私は QT アプリケーションをデスクトップの上端にある最上位のアイコンに折りたたもうとしています。

4

1 に答える 1

6

最初の部分への答えは Qtでボーダレス ウィンドウを作成する にあり、2 番目の部分への答えは 画面内の Qwidget の選択と移動 にあります

2 つを組み合わせて、最後の部分を追加するのは簡単です。

方法は次のとおりです。

#include <QtGui>

class W: public QWidget
{
    Q_OBJECT

ロック/ロック解除して終了するためのいくつかのボタンを備えたボーダレス ウィジェットをセットアップします。

    public:
        W(QWidget *parent=0)
            : QWidget(parent, Qt::FramelessWindowHint), locked(false)
        {
            QPushButton *lock   = new QPushButton("Lock");
            QPushButton *unlock = new QPushButton("Unlock");
            QPushButton *quit   = new QPushButton("&Quit");

            connect(lock,   SIGNAL(clicked()), this, SLOT(lock()));
            connect(unlock, SIGNAL(clicked()), this, SLOT(unlock()));
            connect(quit, SIGNAL(clicked()),
                    QApplication::instance(), SLOT(quit()));

            QHBoxLayout *l = new QHBoxLayout;
            l->addWidget(lock);
            l->addWidget(unlock);
            l->addWidget(quit);
            setLayout(l);
        }

    public slots:
        void lock() {
          locked = true;
          move(x(), 0); // move window to the top of the screen
        }
        void unlock() { locked = false; }

マウス操作を行います:

    protected:
        void mousePressEvent(QMouseEvent *evt)
        {
            oldPos = evt->globalPos();
        }

        void mouseMoveEvent(QMouseEvent *evt)
        {
            const QPoint delta = evt->globalPos() - oldPos;
            if (locked)
                // if locked, ignore delta on y axis, stay at the top
                move(x()+delta.x(), y()); 
            else
                move(x()+delta.x(), y()+delta.y());
            oldPos = evt->globalPos();
        }

    private:
        bool locked;
        QPoint oldPos;
};
于 2013-09-12T14:28:44.303 に答える