2013-06-12 7 views
7

में ज़ूम करने के दौरान आप एक क्विक और गंदा प्रोग्राम कैसे लिखते हैं, जिस पर मैंने काम कर रहे एक प्रोजेक्ट के पहलू को देखने में मदद करने के लिए एक त्वरित और बुरा कार्यक्रम लिखा है। हालांकि मैं 4.1.1 के बाद से क्यूटी के साथ काम कर रहा हूं, मुझे कभी भी क्यूग्राफिक्स * मॉड्यूल का उपयोग करने की ज़रूरत नहीं है।क्यूपीएन पिक्सेल चौड़ाई को क्यूपीआरपीक्स व्यू

जब मैंने प्रोग्राम के साथ खेलना शुरू किया, तो मैं विंडोज़ XP और Qt4.7.0 और विजुअल स्टूडियो 2008 चलाने वाले पुराने कंप्यूटर पर काम कर रहा था। अब मैंने फाइल को विंडोज 8 पर चलने वाले अपने मुख्य कंप्यूटर पर कॉपी किया है। क्यूटी 5 को एक शॉट देने का फैसला किया है इसलिए मैंने Qt5.0.2 के साथ QtCreator स्थापित किया है।

जब मैं Qt4.7.0/XP मशीन पर बनाए गए सटीक कोड को संकलित करता हूं, तो मुझे एक बहुत अलग परिणाम मिलता है।

Zoomed-out view from Qt4.7.0/XP compilation

और यह है कि क्या मैं अपने Qt5.0.2 संकलन पर देखते हैं:

यह वही है मैं अपने Qt4.7.0 संकलन पर देखते हैं Zoomed-out view from Qt5.0.2/Win8x64 compilation

जाहिर है वहाँ में अलग व्यवहार है प्रत्येक आयत की सीमा का चित्रण। इसके अलावा, अगर मैं माउस व्हील का उपयोग करके ज़ूम करता हूं, तो आयताकार सीमा चौड़ाई Qt5 संकलन में बड़ी हो जाती है लेकिन Qt4.7 संकलन में वही (लगभग 1 पिक्सेल चौड़ी) रहता है।

मैं कोड कैसे बदलूं ताकि Qt5 में व्यवहार Qt4.7 जैसा ही हो?

यहाँ पूर्ण कोड है:

#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QGraphicsRectItem> 
#include <QWheelEvent> 

#include <QSqlDatabase> 
#include <QSqlQuery> 
#include <QSqlRecord> 
#include <QVariant> 
#include <QSqlError> 
#include <QMessageBox> 

class ItemData : public QSqlRecord{ 
public: 
    ItemData(QSqlRecord const &rec) : QSqlRecord(rec) {} 

    qreal left() const { return value(0).toDouble(); } 
    qreal top() const { return value(1).toDouble(); } 
    qreal width() const { return value(2).toDouble() - left(); } 
    qreal height() const { return value(3).toDouble() - top(); } 
    QRectF rect() const { return QRectF(left(), top(), width(), height()); } 
    QString barcode() const { return value(4).toString(); } 
    QString msaName() const { return value(5).toString(); } 
    QString msaDescription() const { return value(6).toString(); } 
    QString hsaName() const { return value(7).toString(); } 
    QString hsaDescription() const { return value(8).toString(); } 
}; 

class DSAItem : public QGraphicsRectItem{ 
public: 
    DSAItem(ItemData const &data, QGraphicsItem *parent = 0) 
     :QGraphicsRectItem(parent) { 
      setFlags(QGraphicsItem::ItemIsSelectable); 
      setRect(data.rect()); 
      QString tip = "<p><b>%1</b></p><p><b>MLSA</b><br/>%2<br/>%3</p><p><b>HLSA</b><br/>%4<br/>%5</p>"; 
      setToolTip(tip.arg(data.barcode(), data.msaName(), data.msaDescription(), data.hsaName(), data.hsaDescription())); 
      if(data.barcode() == "1010100101" || data.barcode() == "1010100114"){ 
       colour = QColor(Qt::red); 
      } else { 
       colour = QColor(Qt::yellow); 
      } 
      colour.setAlphaF(.5); 
      setBrush(QBrush(colour)); 
    } 

    QVariant itemChange(GraphicsItemChange change, QVariant const &value){ 
     if (change == QGraphicsItem::ItemSelectedHasChanged){ 
      QColor c = value.toBool() ? QColor(Qt::green) : colour; 
      c.setAlphaF(.5); 
      setBrush(QBrush(c)); 
      update(rect()); 

     } 
     return QGraphicsRectItem::itemChange(change, value); 
    } 

private: 
    QColor colour; 
}; 

class View : public QGraphicsView { 
public: 
    View(QWidget *parent = 0): QGraphicsView(parent){ 
     populateScene(); 
     setScene(&scene); 
     rotate(-90); 
     scale(1.0, -1.0); 
     setDragMode(ScrollHandDrag); 
    } 

protected: 
    void wheelEvent(QWheelEvent *e){ 
     setTransformationAnchor(QGraphicsView::AnchorUnderMouse); 

     double scaleFactor = 1.15; 
     if (e->delta() > 0){ 
      scale(scaleFactor, scaleFactor); 
     } else { 
      scale(1/scaleFactor, 1/scaleFactor); 
     } 
    } 

private: 
    void populateScene(){ 
     QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); 
     //db credentials here 

     QString errorMessage; 
     bool ok = db.open(); 
     if (ok){ 
      QSqlQuery query(db); 
      QString sql = //query string here 

      if (query.exec(sql)){ 
       while(query.next()){ 
        scene.addItem(new DSAItem(query.record())); 
       } 
      } else { 
       errorMessage = query.lastError().text(); 
      } 
     } else { 
      errorMessage = db.lastError().text(); 
     } 

     if (!errorMessage.isEmpty()){ 
      QMessageBox::critical(0, "Database Error", errorMessage); 
     } 
    } 

private: 
    QGraphicsScene scene; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    View view; 
    view.show(); 

    return a.exec(); 
} 

उत्तर

5

सर्वश्रेष्ठ उत्तर यह एक नीचे rpsml द्वारा दिया जाता है। लेकिन ऐतिहासिक कारणों से मैं इसे यहां छोड़ दूंगा।

शून्य करने के लिए कलम की चौड़ाई की स्थापना इसके बारे में 1.

QPen p = pen(); 
p.setWidth(0) 
setPen(p); 
+0

यह पहला बातें मैंने कोशिश की थी, लेकिन कोई, Qt5 में नहीं बल्कि Qt4.7 – RobbieE

+1

QPen :: setWidth के लिए डॉक्स में आइटम के साथ कलम चौड़ाई तराजू() कहते हैं "शून्य की एक लाइन चौड़ाई एक कॉस्मेटिक कलम इंगित करता है। इसका मतलब है कि पेन चौड़ाई हमेशा एक पिक्सेल चौड़ी खींची जाती है, जो चित्रकार पर परिवर्तन सेट से स्वतंत्र होती है। " क्या आपने चौड़ाई को 0 पर सेट करने का प्रयास किया है? –

+0

यह है !!! धन्यवाद कॉरी। संस्करणों के बीच डिफ़ॉल्ट मान बदलना चाहिए। एक उत्तर बनाएं और मैं आपको क्रेडिट दूंगा। – RobbieE

23

चौड़ाई यह थोड़ी देर हो चुकी है के साथ एक "कॉस्मेटिक" कलम कर देगा लेकिन उपयोगी हो सकता है।

प्रस्तावित समाधान ठीक काम करता है, लेकिन कलम widht को सीमित करता है। एक वैकल्पिक शिक्षा

p.setCosmetic(true); 

उपयोग करने के लिए क्यूटी संदर्भ (http://qt-project.org/doc/qt-5/qpen.html#isCosmetic)

कॉस्मेटिक कलम QPainter वे कर रहे हैं पर लागू किए गए परिवर्तनों की परवाह किए बिना स्ट्रोक एक निरंतर चौड़ाई है आकर्षित करने के लिए उपयोग किया जाता है के अनुसार है साथ उपयोग करना।

और यह भी बताता है कि क्यों शून्य कार्यों के लिए चौड़ाई की स्थापना:

एक शून्य चौड़ाई कलम डिफ़ॉल्ट रूप से कॉस्मेटिक है, गैर-शून्य चौड़ाई वाली पेन गैर-कॉस्मेटिक हैं।

+0

मुझे यह जानकारी पसंद है - यह साफ है (स्वीकार्य समाधान से क्लीनर) और अधिक लचीलापन – DomTomCat

+0

आईएमएचओ प्रदान करता है, यह वास्तविक सही उत्तर है। – quimnuss

+0

आखिरी आधा वाक्य काफी संदिग्ध है: "एक शून्य चौड़ाई कलम डिफ़ॉल्ट रूप से कॉस्मेटिक है; गैर-शून्य चौड़ाई वाले पेन गैर-कॉस्मेटिक हैं।" यदि आप केवल अंतिम छमाही पढ़ते हैं "गैर-शून्य चौड़ाई वाली पेन गैर-कॉस्मेटिक हैं।" तो एक गैर-शून्य कलम चौड़ाई कॉस्मेटिक नहीं होनी चाहिए, इससे कोई फर्क नहीं पड़ता कि आपने 'सेट कॉस्मेटिक' में क्या सेट किया है। यह वास्तव में व्यवहार है जब मैं परीक्षण करता हूं (PyQt4.7) – Peter

संबंधित मुद्दे