新建的QImage不显示

u010688690 2013-11-04 05:33:10
主界面包含一个QTabWidget.希望可以手动建立多个QWidget,然后将这些QWidget添加到QTabWidget,作为一个新的页来显示里面的QImage.

由于QImage的大小不确定,所以我用QScrollArea来显示QImage.

PaintArea::PaintArea(QWidget *parent) :
QWidget(parent)
{
image = QImage(20000, 500, QImage::Format_RGB32);
backColor = qRgb(128, 128, 128);
image.fill(backColor);

paint(image);
}

void PaintArea::paint(QImage &theImage)
{
QPainter pp(&theImage); //在theImage上绘图

pp.drawLine(lastPoint,endPoint); //由起始坐标和终止坐标绘制直线

lastPoint = endPoint; //让终止坐标变为起始坐标

update(); //进行更新界面显示,可引起窗口重绘事件,重绘窗口
}


void PaintArea::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawImage(0, 0, image);
}


主程序:
void MainWindow::display_area_init()
{
...
QWidget *tab;
tab = create_tab_widget(); // 新建 “页” 表
ui->tabWidget->addTab(tab, tr(" * ")); // 将新建 “页” 表添加到tabWidget
...
}
QWidget *MainWindow::create_tab_widget()
{
QWidget *tab;
QHBoxLayout *horizontalLayout;
QScrollArea *scrollArea;
PaintArea *scrollAreaWidgetContents;

QSizePolicy sizePolicy_E(QSizePolicy::Expanding, QSizePolicy::Expanding);
sizePolicy_E.setHorizontalStretch(0);
sizePolicy_E.setVerticalStretch(0);

tab = new QWidget();
tab->setObjectName(QString::fromUtf8("tab"));

scrollAreaWidgetContents = new PaintArea();
scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 800, 600));
sizePolicy_E.setHeightForWidth(scrollAreaWidgetContents->sizePolicy().hasHeightForWidth());
scrollAreaWidgetContents->setSizePolicy(sizePolicy_E);

scrollArea = new QScrollArea(tab);
scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
sizePolicy_E.setHeightForWidth(scrollArea->sizePolicy().hasHeightForWidth());
scrollArea->setSizePolicy(sizePolicy_E);
scrollArea->setFrameShape(QFrame::NoFrame);
scrollArea->setWidget(scrollAreaWidgetContents);

horizontalLayout = new QHBoxLayout(tab);
horizontalLayout->setSpacing(0);
horizontalLayout->setContentsMargins(0, 0, 0, 0);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
horizontalLayout->addWidget(scrollArea);

return tab;
}

现在的问题是:当我第一次手动建立新页时,可以出现一个长宽为20000*500的灰色底色的QImage.当我再想建立一个新的页面时,新页面却显示不了这个长宽为20000*500的灰色底色的QImage.当我把第一个已经成功显示的灰色底色的QImage的页,删除掉delete (ui->tabWidget->currentWidget());后面再生成新的页就可以正常显示灰底的QImage,而且还是只能显示一个这样的页面。

请问这个问题是什么原因造成的?该怎么解决让多个QImage页都可以正常显示?
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
RabinSong 2013-11-08
  • 打赏
  • 举报
回复
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 20000, 500));就改了这个地方
u010688690 2013-11-05
  • 打赏
  • 举报
回复
RabinSong兄弟: 你的程序已经通过了,可以正常显示.但是我把你的代码整合到我自己的上面,还是不能正常.我找不出区别在哪里.无非是,你一次建3个,我一次一个建. 请指教
RabinSong 2013-11-05
  • 打赏
  • 举报
回复
这是test.cpp文件的内容 #include <qapplication.h> #include <qdebug.h> #include <qtextedit.h> #include <qwidget.h> #include <qtablewidget.h> #include <qlayout.h> #include <qscrollarea.h> #include <qimage.h> #include <qpainter.h> class PaintArea : public QWidget { public: PaintArea(QWidget *parent = NULL); void paint(QImage &theImage); void paintEvent(QPaintEvent *); private: QImage image; QColor backColor; QPointF lastPoint, endPoint; }; PaintArea::PaintArea(QWidget *parent) : QWidget(parent) { image = QImage(20000, 500, QImage::Format_RGB32); backColor = qRgb(128, 128, 128); //image.fill(backColor); paint(image); } void PaintArea::paint(QImage &theImage) { QPainter pp(&theImage); //在theImage上绘图 pp.drawLine(lastPoint, endPoint); //由起始坐标和终止坐标绘制直线 lastPoint = endPoint; //让终止坐标变为起始坐标 update(); //进行更新界面显示,可引起窗口重绘事件,重绘窗口 } void PaintArea::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawImage(0, 0, image); } class MainWindow : public QTabWidget { public: void display_area_init(); QWidget *create_tab_widget(); }; void MainWindow::display_area_init() { QWidget *tab; tab = create_tab_widget(); // 新建 “页” 表 addTab(tab, tr(" * ")); // 将新建 “页” 表添加到tabWidget tab = create_tab_widget(); addTab(tab, tr(" *1 ")); tab = create_tab_widget(); addTab(tab, tr(" *1 3")); } QWidget *MainWindow::create_tab_widget() { QWidget *tab; QHBoxLayout *horizontalLayout; QScrollArea *scrollArea; PaintArea *scrollAreaWidgetContents; QSizePolicy sizePolicy_E(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy_E.setHorizontalStretch(0); sizePolicy_E.setVerticalStretch(0); tab = new QWidget(); tab->setObjectName(QString::fromUtf8("tab")); scrollAreaWidgetContents = new PaintArea(); scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents")); scrollAreaWidgetContents->setGeometry(QRect(0, 0, 20000, 500)); sizePolicy_E.setHeightForWidth(scrollAreaWidgetContents->sizePolicy().hasHeightForWidth()); scrollAreaWidgetContents->setSizePolicy(sizePolicy_E); scrollArea = new QScrollArea(tab); scrollArea->setObjectName(QString::fromUtf8("scrollArea")); sizePolicy_E.setHeightForWidth(scrollArea->sizePolicy().hasHeightForWidth()); scrollArea->setSizePolicy(sizePolicy_E); scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->setWidget(scrollAreaWidgetContents); horizontalLayout = new QHBoxLayout(tab); horizontalLayout->setSpacing(0); horizontalLayout->setContentsMargins(0, 0, 0, 0); horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); horizontalLayout->addWidget(scrollArea); return tab; } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow m; m.display_area_init(); m.show(); return a.exec(); }
RabinSong 2013-11-05
  • 打赏
  • 举报
回复
#------------------------------------------------- # # Project created by QtCreator 2013-05-16T16:15:06 # #------------------------------------------------- TEMPLATE = app SOURCES += test.cpp 这是.pro文件里的内容
u010688690 2013-11-05
  • 打赏
  • 举报
回复
RabinSong兄弟,谢谢. 你给的代码不能用,并没有解决我的问题.如果你自己测试没有问题,请把你的测试工程文件给我大包一份可以么?
RabinSong 2013-11-04
  • 打赏
  • 举报
回复
#include <qapplication.h> //#include "listview.h" #include <qdebug.h> #include <qtextedit.h> #include <qwidget.h> #include <qtablewidget.h> #include <qlayout.h> #include <qscrollarea.h> #include <qimage.h> #include <qpainter.h> class PaintArea : public QWidget { public: PaintArea(QWidget *parent = NULL); void paint(QImage &theImage); void paintEvent(QPaintEvent *); private: QImage image; QColor backColor; QPointF lastPoint, endPoint; }; PaintArea::PaintArea(QWidget *parent) : QWidget(parent) { image = QImage(20000, 500, QImage::Format_RGB32); backColor = qRgb(128, 128, 128); //image.fill(backColor); paint(image); } void PaintArea::paint(QImage &theImage) { QPainter pp(&theImage); //在theImage上绘图 pp.drawLine(lastPoint, endPoint); //由起始坐标和终止坐标绘制直线 lastPoint = endPoint; //让终止坐标变为起始坐标 update(); //进行更新界面显示,可引起窗口重绘事件,重绘窗口 } void PaintArea::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawImage(0, 0, image); } class MainWindow : public QTabWidget { public: void display_area_init(); QWidget *create_tab_widget(); }; void MainWindow::display_area_init() { QWidget *tab; tab = create_tab_widget(); // 新建 “页” 表 addTab(tab, tr(" * ")); // 将新建 “页” 表添加到tabWidget tab = create_tab_widget(); addTab(tab, tr(" *1 ")); tab = create_tab_widget(); addTab(tab, tr(" *1 3")); } QWidget *MainWindow::create_tab_widget() { QWidget *tab; QHBoxLayout *horizontalLayout; QScrollArea *scrollArea; PaintArea *scrollAreaWidgetContents; QSizePolicy sizePolicy_E(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy_E.setHorizontalStretch(0); sizePolicy_E.setVerticalStretch(0); tab = new QWidget(); tab->setObjectName(QString::fromUtf8("tab")); scrollAreaWidgetContents = new PaintArea(); scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents")); scrollAreaWidgetContents->setGeometry(QRect(0, 0, 20000, 500)); sizePolicy_E.setHeightForWidth(scrollAreaWidgetContents->sizePolicy().hasHeightForWidth()); scrollAreaWidgetContents->setSizePolicy(sizePolicy_E); scrollArea = new QScrollArea(tab); scrollArea->setObjectName(QString::fromUtf8("scrollArea")); sizePolicy_E.setHeightForWidth(scrollArea->sizePolicy().hasHeightForWidth()); scrollArea->setSizePolicy(sizePolicy_E); scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->setWidget(scrollAreaWidgetContents); horizontalLayout = new QHBoxLayout(tab); horizontalLayout->setSpacing(0); horizontalLayout->setContentsMargins(0, 0, 0, 0); horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); horizontalLayout->addWidget(scrollArea); return tab; } int main(int argc, char *argv[]) { QApplication a(argc, argv); // a.setStyle(new CProxyStyle); // CKeyBoard *pInputContext = new CKeyBoard(); // a.setInputContext(pInputContext); // CListView listView(NULL); // listView.show(); // QRegExp rx("\\([0-9]+\\)"); // QString str = "(23) P ((1) @)"; // int pos = 0; // while ((pos = rx.indexIn(str, pos)) != -1) { // //list << rx.cap(1); // qDebug() << rx.cap(); // pos += rx.matchedLength(); // } MainWindow m; m.display_area_init(); m.show(); return a.exec(); } 这是俺的测试代码
RabinSong 2013-11-04
  • 打赏
  • 举报
回复
scrollAreaWidgetContents->setGeometry(QRect(0, 0, 20000, 500));

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧