• 5789阅读
  • 7回复

[提问]QTableWidget和QPainter不能共存的问题 [复制链接]

上一主题 下一主题
离线piteqiu
 

只看楼主 倒序阅读 楼主  发表于: 2011-11-20
编制了一个程序,需要用到QTableWidget和QPainter,遇到以下问题
1. 若只有QTableWidget或者QPainter都能正常工作,但是如果把两个都加上,则只显示QTableWidget,不能显示QPainter。

将mainwindow.cpp中的vlayout->addWidget(table);注释掉,则正确显示图形,如下图:
window.open('http://www.qtcn.org/bbs/attachment/Mon_1111/17_108454_705c52fb902b9a0.png?4');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >
将mainwindow.cpp中的vlayout->addWidget(table);  注释打开,则只能显示table,不能显示painter,如下图:




2. 请教如何做到既显示QTableWidget又能正确显示QPainter,谢谢!


----------------------------------------main.cpp---------------------------------------
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *mainwindow=new MainWindow;
    mainwindow->show();

    return a.exec();
}
----------------------------------------mainwindow.h---------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui>

class QPushButton;
class QTableWidget;
class QLabel;
class QLineEdit;
class RenderArea;
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow();
    ~MainWindow();
private:
    QLabel *nvlabel,*nlooplabel;
    QLineEdit *nvlineedit,*nlooplineedit;
    QTableWidget *table,*abc_table;
    QPushButton *fitButton,*closeButton,*okButton,*paint_Button;
    QHBoxLayout *tophlayout,*hlo;
    QVBoxLayout *vlayout;
    QWidget *window;
    RenderArea *renderArea;
private:
     void initWidgets();
private slots:
     void create_table();  
};
#endif // MAINWINDOW_H
----------------------------------------mainwindow.cpp---------------------------------------
#include "mainwindow.h"
#include "render.h"
#include <QtGui>
MainWindow::MainWindow()
{
    initWidgets();
}

MainWindow::~MainWindow()
{
}
void MainWindow::initWidgets()
{
    //表格
    table=new QTableWidget;
     //按钮
    QString a1=tr("回归ABC");
    fitButton= new QPushButton(a1);
    QString a2=tr("关闭程序");
    closeButton=new QPushButton(a2);
    QString a3=tr("确定参数");
    okButton=new QPushButton(a3);
    //label
    QString a4=tr("拉速个数");
    nvlabel=new QLabel(a4);
    QString a5=tr("回路个数");
    nlooplabel=new QLabel(a5);     //上方,水平layout
    tophlayout = new QHBoxLayout;
    tophlayout->addWidget(nvlabel);
    tophlayout->addWidget(nvlineedit);
    tophlayout->addWidget(nlooplabel);
    tophlayout->addWidget(nlooplineedit);
    tophlayout->addWidget(okButton);
    tophlayout->addStretch();
    renderArea = new RenderArea;

    //整体layout
    vlayout = new QVBoxLayout;
    vlayout->addLayout(tophlayout);
    vlayout->addWidget(table);
    vlayout->addWidget(renderArea);

    window = new QWidget;
    window->setLayout(vlayout);
    setWindowTitle(tr("fit ABC"));
    setCentralWidget(window);
    showMaximized();
}

void MainWindow::create_table()
{
    nv=nvlineedit->text().toInt();

}
---------------------------------------------------------render.h---------------------------------------------------
#ifndef RENDERAREA_H
#define RENDERAREA_H
#include <QWidget>
class RenderArea : public QWidget
{
    Q_OBJECT
public:
     RenderArea(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *event);
};
#endif
---------------------------------------------------------render.cpp---------------------------------------------------
#include <QtGui>
#include "render.h"
RenderArea::RenderArea(QWidget *parent)
: QWidget(parent)
{
    setBackgroundRole(QPalette::Base);
    setAutoFillBackground(true);
}

void RenderArea::paintEvent(QPaintEvent * /* event */)
{
    static const QPoint points[4] = {
        QPoint(10, 80),
        QPoint(20, 10),
        QPoint(80, 30),
        QPoint(90, 70)
    };

}






离线dbzhang800

只看该作者 1楼 发表于: 2011-11-21
考虑场景:一方面你在一个大黑饭上作画,另一方面,你在该大黑板上又挂满的小黑板了。你觉得应该什么效果?
离线zhy282289
只看该作者 2楼 发表于: 2011-11-21
你在墙上画了幅画,然后你在墙上又挂上另一幅画,此时显示的是哪幅
为什么我脸这么胖~
离线piteqiu

只看该作者 3楼 发表于: 2011-11-21
引用第1楼dbzhang800于2011-11-21 08:54发表的  :
考虑场景:一方面你在一个大黑饭上作画,另一方面,你在该大黑板上又挂满的小黑板了。你觉得应该什么效果?



照着basicdrawing的例子做的,按我的理解,一些widget,然后layout上去,如果没有tabwidget好像都能正常显示,加上tabwidget就不行了。

与您说的好像有点差别:我在大黑板上挂一些类型的小黑板可以正常显示,加上某块小黑板就不行了!
离线piteqiu

只看该作者 4楼 发表于: 2011-11-21
引用第2楼zhy282289于2011-11-21 09:04发表的  :
你在墙上画了幅画,然后你在墙上又挂上另一幅画,此时显示的是哪幅

我是挂了多幅画,但是是在不同位置挂的啊!是layout的不同位置,为什么不能同时显示?
离线piteqiu

只看该作者 5楼 发表于: 2011-11-22
有没有人遇到类似的问题,真诚请教!
离线dbzhang800

只看该作者 6楼 发表于: 2011-11-22
引用第3楼piteqiu于2011-11-21 09:14发表的  :
照着basicdrawing的例子做的,按我的理解,一些widget,然后layout上去,如果没有tabwidget好像都能正常显示,加上tabwidget就不行了。
.......

确保你的widget有合适的sizeHint,和 sizePolicy,以免显示大小为0或很小
离线zhy282289
只看该作者 7楼 发表于: 2011-11-22
明白你的意思了,
看下你和源例子有什么不同...
tabwidget是不是给了他this?
为什么我脸这么胖~
快速回复
限100 字节
 
上一个 下一个