Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用剪裁绘制QPixmap以获得性能_C++_Qt - Fatal编程技术网

C++ 使用剪裁绘制QPixmap以获得性能

C++ 使用剪裁绘制QPixmap以获得性能,c++,qt,C++,Qt,我正在尝试在Qt中创建一个支持缩放的简单图像查看器 要显示图像文件,我将其加载到QImage中并创建一个QPixmap class NN: public QWidget{ Q_OBJECT Q_DISABLE_COPY(NN) public: NN(QWidget* parent = nullptr) : QWidget(parent){ } const QPixmap& pixmap() const { return m

我正在尝试在Qt中创建一个支持缩放的简单图像查看器

要显示图像文件,我将其加载到QImage中并创建一个QPixmap

class NN: public QWidget{
    Q_OBJECT
    Q_DISABLE_COPY(NN)
public:
    NN(QWidget* parent = nullptr) : QWidget(parent){
    }
    const QPixmap& pixmap() const 
    {
        return m_pixmap;
    }
    void setPixmap(const QPixmap& px) 
    {
        m_pixmap = px;
        update();
    }
protected:
    void paintEvent(QPaintEvent*)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, false);
        style()->drawItemPixmap(&painter, rect(), Qt::AlignCenter, m_pixmap.scaled(rect().size()));
    }
private:
    QPixmap m_pixmap;
};
(此小部件是滚动区域的一部分)

这很好,但当我尝试加载大图像并放大时,性能开始下降(滞后)

我曾想过在
drawItemPixmap()
方法中应用一个剪辑,但我不太确定它如何以及是否有助于提高性能

我的问题是剪辑的想法是否可行,如果可行,如何实现。如果没有,也许还有其他提高性能的方法?

正如我在中指出的,最好使用QGraphicsView进行图像缩放,因此我将代码转换为C++:

#包括
类ImageViewer:公共QGraphicsView{
公众:
ImageViewer(QWidget*parent=nullptr):QGraphicsView(父){
SetRenderInts(QPaint::抗锯齿| QPaint::SmoothPixmapTransform);
//setAlignment(Qt::AlignLeft | Qt::AlignTop);
setAlignment(Qt::AlignCenter);
挫折背景角色(Qpalete::Dark);
Qgraphicscene*场景=新的Qgraphicscene(此);
场景(场景);
pixmapItem=新的QGraphicsPixmapItem;
场景->添加项(pixmapItem);
}
bool setPixmap(const QPixmap和pixmap){
if(pixmap.isNull())
返回false;
pixmapItem->setPixmap(pixmap);
返回true;
}
无效缩放(QRF){
量表(f,f);
}
void zoomIn(){
缩放(因子);
}
void zoomOut(){
缩放(1.0/系数);
}
void resetZoom(){
resetTransform();
}
void fitToWindow(){
fitInView(scen直立(),Qt::KeepAspectRatio);
}
私人:
qreal系数=2.0;
QGraphicsPixmapItem*pixmapItem;
};
类主窗口:公共QMainWindow{
Q_对象
公众:
主窗口(QWidget*parent=nullptr):QMainWindow(parent),
视图(新的ImageViewer)
{
setCentralWidget(视图);
createActions();
创建菜单();
调整大小(640480);
}
专用Q_插槽:
空开(){
QStringList l;
for(const-QByteArray&ba:QImageReader::supportedImageFormats()){
我是空的(){
bool-loaded=view->setPixmap(QPixmap(文件名));
fitToWindowAct->setEnabled(已加载);
updateActions();
}
}
void fitToWindow(){
如果(fitToWindowAct->isChecked())
查看->安装窗口();
其他的
查看->重置缩放();
updateActions();
}
关于(){
QMessageBox::about(这是“ImageViewer”、“ImageViewer”);
}
私人:
void createActions(){
openAct=新的QAction(“&Open…”,this);
openAct->setShortcut(QKeySequence(“Ctrl+O”);
连接(openAct,&QAction::triggered,this,&MainWindow::open);
exitAct=新的QAction(“E&xit”,本);
exitAct->setShortcut(QKeySequence(“Ctrl+Q”);
连接(exitAct、&QAction::triggered、this、&MainWindow::close);
zoomInAct=新的QAction(tr(“放大(25%)”),本);
zoomInAct->setShortcut(QKeySequence(“Ctrl++”);
zoomInAct->setEnabled(假);
连接(zoomInAct,&QAction::triggered,view,&ImageViewer::zoomIn);
zoomOutAct=新的QAction(tr(“缩放(25%)”),本);
zoomOutAct->setShortcut(QKeySequence(“Ctrl+-”);
zoomOutAct->setEnabled(假);
连接(zoomOutAct,&QAction::triggered,view,&ImageViewer::zoomOut);
normalSizeAct=新的QAction(tr(“&Normal Size”)、此;
normalSizeAct->setShortcut(QKeySequence(“Ctrl+S”);
normalSizeAct->setEnabled(假);
连接(normalSizeAct,&QAction::triggered,view,&ImageViewer::resetZoom);
fitToWindowAct=新的QAction(tr(“&Fit to Window”)、此;
fitToWindowAct->setShortcut(QKeySequence(“Ctrl+F”);
fitToWindowAct->setEnabled(假);
fitToWindowAct->setCheckable(真);
连接(fitToWindowAct,&QAction::triggered,this,&main窗口::fitToWindow);
aboutAct=新的QAction(tr(“&About”)、本;
连接(aboutAct,&QAction::triggered,this,&main窗口::about);
AboutTouch=新的QAction(tr(“About&Qt”),即本;
连接(AboutTouch,&QAction::triggered,qApp,&QApplication::aboutQt);
}
void createMenus(){
fileMenu=newqmenu(tr(“&File”)、此文件;
文件菜单->添加操作(openAct);
文件菜单->添加分隔符();
文件菜单->添加操作(exitAct);
viewMenu=新的QMenu(tr(“&View”)、此菜单;
查看菜单->添加操作(缩放);
查看菜单->添加操作(zoomOutAct);
查看菜单->添加操作(normalSizeAct);
查看菜单->添加分隔符();
视图菜单->添加操作(fitToWindowAct);
helpMenu=新的QMenu(tr(“&Help”),这是;
帮助菜单->添加操作(aboutAct);
帮助菜单->添加操作(AboutTouch);
菜单栏()->添加菜单(文件菜单);
菜单栏()->添加菜单(查看菜单);
菜单栏()->添加菜单(帮助菜单);
}
void updateActions(){
zoomInAct->setEnabled(不适用于InDoWact->isChecked());
zoomOutAct->setEnabled(不适用于InDoWact->isChecked());
normalSizeAct->setEnabled(不适用于InDoWact->isChecked());
}
ImageViewer*视图;
QAction*openAct;
QAction*exitAct;
QAction*动物行为;
QAction*动物触觉;
QAction*normalSizeAct;
QAction*fitToWindowAct;
QAction*aboutAct;
QAction*关于接触;
QMenu*文件菜单;
QMenu*查看菜单;
QMenu*帮助菜单;
};
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}
#包括“main.moc”
正如我在中指出的,最好使用QGraphicsView进行图像缩放,因此我将把代码翻译成C++:

#包括
类ImageViewer:公共QGraphicsView{
公众:
ImageViewer(QWidget*parent=nullptr):QGraphicsView(父){
SetRenderInts(QPaint::抗锯齿| QPaint::平滑
m_pixmap.scaled(rect().size())
painter.drawPixmap(rect(), m_pixmap, srcRect);