Здесь будет много чего реализовать.Я выполнил это следующим образом:
Шаг 1. Подкласс QLabel, позволяющий захватывать щелчки мыши.В заголовке объявите сигналы Clicked и Pressed и переопределите соответствующие события мыши.
LabelButton::LabelButton(QWidget *parent) : QLabel(parent)
{
}
void LabelButton::mouseReleaseEvent(QMouseEvent *event){
emit Clicked();
event->accept();
}
void LabelButton::mousePressEvent(QMouseEvent *event){
emit Pressed();
event->accept();
}
Шаг 2. Добавьте LabelButton с именем xbutton, содержащую круглое изображение «x», в ваш виджет в нужном вам месте.
Пример (это будет в вашей функции setupUi):
...
xbutton = new LabelButton(MainWidget);
xbutton->setObjectName(QString::fromUtf8("xbutton"));
xbutton->setGeometry(QRect(0, 0, 31, 31));
xbutton->setPixmap(QPixmap(QString::fromUtf8(":/xbutton.gif")));
xbutton->setAlignment(Qt::AlignCenter);
...
Шаг 3. Создайте свой виджет.Установите прозрачный фон и убедитесь, что его размер включает пространство для кнопки закрытия «х».Примечание. Установка прозрачного фона означает, что ваш виджет должен будет содержать некоторый дочерний виджет, который принимает ввод от пользователя.
Пример:
mywidget::mywidget(QWidget *parent): QWidget(parent){
setupUi(this);
moving=false; // notice that you must declare this bool for Step 4.
offset=QPoint(0,0); // Also a QPoint for Step 4
#if defined(Q_WS_MAC) //These values worked for me with the Mac OS 10.5 SDK
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::Window);
QPalette pal = this->palette();
pal.setColor(this->backgroundRole(), Qt::transparent);
this->setPalette(pal);
#elif defined(Q_WS_WIN)//These values worked for me on Windows XP/Vista/7
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint |Qt::FramelessWindowHint | Qt::Window);
setStyleSheet("background:transparent;");
setAttribute(Qt::WA_TranslucentBackground);
#endif
connect(xbutton,SIGNAL(Clicked()),this,SLOT(hide()));
}
Теперь у вас есть функциональность, которую вы изначально хотели,Когда вы нажмете кнопку x, окно закроется.Но у вас не будет нормальной функции перемещения, пока вы не реализуете это.
Шаг 4. Реализация функции перемещения в вашем виджете.
/*
FUNCTION:mousePressEvent
used to help move the widget since there is no title bar, sets the initial offset of the mouse
*/
void mywidget::mousePressEvent(QMouseEvent *event){
if((event->button() == Qt::LeftButton)) {
moving = true;
offset = event->globalPos() - this->pos();
}
}
/*
FUNCTION:mouseReleaseEvent
used to help move the widget since there is no title bar, releases the "moving" attribute
*/
void mywidget::mouseReleaseEvent(QMouseEvent *event){
if(event->button() == Qt::LeftButton) {
moving = false;
}
}
/*
FUNCTION:mouseMoveEvent
used to help move the widget since there is no title bar
*/
void mywidget::mouseMoveEvent(QMouseEvent *event){
if(moving){
QPoint global = event->globalPos();
this->setGeometry(global.x()-offset.x(),global.y()-offset.y(),this->width(),this->height());
}
}
Я нашел этот способ наиболее полезным для меня,потому что мне нужно было много функциональности из моего настраиваемого скользкого виджета.
Мне очень нравятся креативные пользовательские интерфейсы, и я надеюсь, что когда вы закончите, ваш внешний вид будет действительно гладким!