我很感激帮助在 Qt 中创建具有以下特征的顶级窗口。窗口必须是:
- 无边框,无标题,位于桌面上所有其他窗口的顶部(简单)
- 通过单击并拖动其中的任何位置可拖动(这是我需要帮助的)
- 拖动时限制在桌面的上边框(相对容易)
基本上,我试图将我们的 QT 应用程序折叠到桌面顶部边框上的顶级图标。
我很感激帮助在 Qt 中创建具有以下特征的顶级窗口。窗口必须是:
基本上,我试图将我们的 QT 应用程序折叠到桌面顶部边框上的顶级图标。
您将在以下部分找到第一部分的答案:使用 for Qt 创建一个无边框窗口,以及在Select & Moving Qwidget in the screen 中找到第二部分的答案。
将两者结合起来并添加最后一部分很简单。
你可以这样做:
#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;
};