Qt中如何对控件实现整体缩放和界面复制?
标题中的整体缩放指的是,当改变控件大小时,控件带着内部所有视觉元素,作为一个整体缩放,就像变成了它自己的缩略图一样,但缩放后的控件仍然能正常操作;类似于WPF中的Viewbox控件;
标题中的界面复制指的是,制作一个控件的缩略图,放在另一个图像类控件上显示。当然:1.这个缩略图是实时的;2.整体缩放功能是必须有的;3.就算源控件的一部分或全部因为(被遮挡、不在父容器窗口内、没有设置父容器从而没有加入可视树)等原因不可见,只要该界面本身存在,就存在正常的缩略图。类似于WPF中的VisualBrush类。
Qt中是否内置了提供相应功能的类?没有的话,能否自己方便的实现?
谢谢,因为可用分不多,所以只能在有效答案出来后再加分,望谅解,加分能让您满意的
[解决办法]
那就只能重载resizeEvent了,在重载事件里根据父窗口布局大小,来相应缩放子控件的大小
QObjectList *pChildList = this->children();//找到所有的孩子,再判断孩子是否是派生自QWidget,只有这样的孩子,才是窗体,才能对窗体缩放,
可以通过
setGeometry()
resize
等方法实现缩放
如果你要实现鼠标放在控件上,你需要重载,mouse hover事件。
[解决办法]
#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QPushButton>
class Shower: public QWidget
{
public:
Shower(QWidget* copyWidget, QWidget* parent = 0): QWidget(parent),
m_pCopyWidget(copyWidget)
{
}
~Shower()
{
}
protected:
void paintEvent(QPaintEvent *event)
{
m_pCopyWidget->render(this);
}
private:
QWidget* m_pCopyWidget;
};
class ScaleWidget: public QWidget
{
public:
ScaleWidget(QWidget* parent = 0): QWidget(parent)
{
resize(400, 200);
}
~ScaleWidget()
{
}
protected:
void paintEvent(QPaintEvent *event)
{
QPainter painter(this);
/*
painter.setWindow(-50, -50, 100, 100);
painter.setViewport(0, 0, width(), height());
*/
painter.setWindow(-50, -50, 100, 100);
int minLength = width() < height() ? width() : height();
painter.setViewport((width() - minLength) >> 1, (height() - minLength) >> 1, minLength, minLength);
painter.fillRect(-10, -10, 20, 20, Qt::red);
painter.drawText(-50, -50, 30, 100, Qt::AlignCenter, "TEST");
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QWidget mainWidget;
mainWidget.resize(650, 150);
QPushButton* pButtonA = new QPushButton("ButtonA", &mainWidget);
pButtonA->resize(150, 50);
pButtonA->move(50, 50);
QPushButton* pButtonB = new QPushButton("ButtonB", &mainWidget);
pButtonB->resize(150, 50);
pButtonB->move(250, 50);
Shower* pShower = new Shower(pButtonA, &mainWidget);
pShower->resize(150, 50);
pShower->move(450, 50);
pShower->connect(pButtonA, SIGNAL(clicked()), SLOT(update()));
pShower->connect(pButtonB, SIGNAL(clicked()), SLOT(update()));
mainWidget.show();
ScaleWidget scaleWidget;
scaleWidget.show();
return app.exec();
}