首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt中怎么对控件实现整体缩放和界面复制

2013-11-12 
Qt中如何对控件实现整体缩放和界面复制?标题中的整体缩放指的是,当改变控件大小时,控件带着内部所有视觉元

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();
}

热点排行