环境:Win10 + Visual Studio 2019 + Qt 5.14.0
最近做Qt开发,为了要实现QWidget的鼠标点击事件,写了继承自QWidget的自定义类MyWidget,然后在Qt Designer界面将QWidget提升为MyWidget。但是运行时候出现了问题:
就是我提升为MyWidget的那个QWidget控件的提升之前设置的QWidget的灰色边框消失了(但是鼠标点击事件正常),没有提升为MyWidget的QWidget控件没事。然后采取了以下措施:
- 在MyWidget类的构造函数里设置边框:(失败)
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { this->setStyleSheet("border:1px solid rgb(200, 200, 200);"); }
- 在MainWindow里两种方法设置边框属性。(失败)
ui.QWidgetPreview->setStyleSheet("MyWidget{border:1px solid rgb(200, 200, 200);}");
网上也没有相关的问题,所以也找不到解决方法,最后迫于无奈,随手改了就成功了,原来问题出在这里:myQWidget = new MyWidget(this); myQWidget->setStyleSheet("MyWidget{border:1px solid rgb(200, 200, 200);}");
将自定义类中的 O_OBJECT 删掉就好了!!!怪我自己创建Qt类的时候将 Insert Q_OBJECT macro 勾选上了。
后续更新
虽然这样就能解决属性的问题,但是会出现一个新的问题,就是没法在 mainwindow.cpp 中绑定信号槽了。详情如下:
mywidget.h
#pragma once
#include <QWidget>
#include <QMouseEvent>
class MyWidget : public QWidget
{
//Q_OBJECT
public:
MyWidget(QWidget *parent);
~MyWidget();
protected:
virtual void mousePressEvent(QMouseEvent* event);
signals:
void clicked();
};
mywidget.cpp
#include "mywidget.h"
#include <qDebug>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
//this->setStyleSheet("border:1px solid rgb(200, 200, 200);");
}
MyWidget::~MyWidget()
{
}
void MyWidget::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
emit clicked();
}
QWidget::mousePressEvent(event);
//qDebug() << this->objectName();
}
mainwindow.cpp
connect(ui.QWidgetPreview41, SIGNAL(clicked()), this, SLOT(widgetPressed()));
这样编译就会报错:
此时把 Q_OBJECT 的注释去掉加上去就不会报错了。
但是这样就跟前面的问题有冲突了T.T。哭了,后续持续更新。